/ Hex Artifact Content
Login

Artifact 15f245fd12596cd86027e1f8d15ba670ffb954189696cd529bbc399f2b5ee473:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
07c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
07d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
07e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61  return sqlite3Ta
07f0: 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
0800: 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  y(pExpr->pTab, p
0810: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0820: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0830: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0850: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
0860: 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  s&EP_xIsSelect )
0870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
0880: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0890: 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  (.        pExpr-
08a0: 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63  >pLeft->x.pSelec
08b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
08c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
08d0: 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  pr.    );.  }.  
08e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
08f0: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0900: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0910: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0920: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0930: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0940: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
0950: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
0960: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
0970: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
0980: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
0990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
09a0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
09b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
09c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
09d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
09e0: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
09f0: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0a00: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0a20: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0a30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0a40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0a50: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  Token(.  Parse *
0a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0a70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
0a80: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
0a90: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
0aa0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43     /* Add the "C
0ab0: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74  OLLATE" clause t
0ac0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
0ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  n */.  const Tok
0ae0: 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20  en *pCollName,  
0af0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
0b00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
0b10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b30: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 70  rue to dequote p
0b40: 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  CollName */.){. 
0b50: 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e   if( pCollName->
0b60: 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  n>0 ){.    Expr 
0b70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
0b80: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
0b90: 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c  >db, TK_COLLATE,
0ba0: 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75   pCollName, dequ
0bb0: 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ote);.    if( pN
0bc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0bd0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0be0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0bf0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0c00: 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20  |EP_Skip;.      
0c10: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
0c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0c30: 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a   pExpr;.}.Expr *
0c40: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0c50: 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72 73  llateString(Pars
0c60: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0c70: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
0c80: 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e  ar *zC){.  Token
0c90: 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   s;.  assert( zC
0ca0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
0cb0: 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28 63  TokenInit(&s, (c
0cc0: 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75  har*)zC);.  retu
0cd0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 64  rn sqlite3ExprAd
0ce0: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0cf0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 2c  arse, pExpr, &s,
0d00: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b   0);.}../*.** Sk
0d10: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0d20: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
0d30: 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c   and any unlikel
0d40: 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69  y().** or likeli
0d50: 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  hood() function 
0d60: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  at the root of a
0d70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  n expression..*/
0d80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78  prSkipCollate(Ex
0da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68  pr *pExpr){.  wh
0db0: 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78  ile( pExpr && Ex
0dc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0dd0: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0de0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e30: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0e40: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0e50: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0e60: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0e80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0e90: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0ea0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0ed0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0ef0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
0f00: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0f10: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
0f20: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0f30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0f50: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0f60: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0f70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0f80: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0f90: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0fa0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0fb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0fc0: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0fe0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0ff0: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
1000: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
1010: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
1020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1030: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
1040: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
1050: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
1060: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
1070: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
1080: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
1090: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
10a0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
10b0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10d0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
10e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1100: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
1110: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
1120: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( p ){.    int o
1130: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69  p = p->op;.    i
1140: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1150: 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b  _Generic ) break
1160: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ;.    if( op==TK
1170: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1180: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1190: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
11a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
11c0: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
11d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
11e0: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
11f0: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1220: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1230: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1250: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
1260: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1270: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1280: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1290: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
12a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26  TRIGGER).     &&
12b0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
12c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
12d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
12e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
12f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1300: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1310: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1320: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1330: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1340: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
1360: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1370: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1390: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
13a0: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
13b0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13e0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1420: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1430: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1440: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
1450: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1460: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1470: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1490: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
14a0: 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b  xt  = p->pRight;
14b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
14c0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
14d0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
14e0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
14f0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
1500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1510: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1520: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1530: 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61         /* p->fla
1540: 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c  gs holds EP_Coll
1550: 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74  ate and p->pLeft
1560: 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74  ->flags does not
1570: 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a  .  And.        *
1580: 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63  * p->x.pSelect c
1590: 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d  annot.  So if p-
15a0: 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c  >x.pLeft exists,
15b0: 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74   it must hold at
15c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73  .        ** leas
15d0: 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65  t one EP_Collate
15e0: 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f  . Thus the follo
15f0: 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e  wing two ALWAYS.
1600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1610: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
1620: 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61 73   ALWAYS(!ExprHas
1630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
1640: 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20  IsSelect)) ){.  
1650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1660: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1670: 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e  ; ALWAYS(i<p->x.
1680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69  pList->nExpr); i
1690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16b0: 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  erty(p->x.pList-
16c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[i].pExpr, EP_
16d0: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
16e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20            pNext 
16f0: 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  = p->x.pList->a[
1700: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1740: 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70   }.        p = p
1750: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1790: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
17a0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
17b0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
17c0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
17e0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
17f0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1800: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1810: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1820: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1830: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1850: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1860: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1870: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1880: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1890: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
18a0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
18b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
18c0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
18d0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
18e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
18f0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1900: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1910: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1920: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1930: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1940: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1950: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1960: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1970: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1980: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
19a0: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
19b0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
19c0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
19d0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
19e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1a20: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1a30: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1a40: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1a50: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1a60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1a70: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1a80: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1a90: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1aa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1ac0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ad0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ae0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1af0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1b00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1b10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1b20: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1b30: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1b40: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1b50: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1b60: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1b70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1b80: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1b90: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1ba0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1bb0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1bc0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1bd0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1be0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1bf0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1c00: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
1c10: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1c20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1c30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1c40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1c50: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1c60: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1c70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1c80: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1c90: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1ca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
1cd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
1ce0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1cf0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
1d00: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
1d10: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1d30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d40: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1d50: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1d60: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d70: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1d80: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1d90: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1da0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1db0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1dc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1dd0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1de0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1df0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1e00: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
1e10: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
1e20: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
1e30: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
1e40: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
1e50: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1e60: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
1e70: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
1e80: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
1e90: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
1ea0: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
1eb0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
1ec0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
1ed0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
1ee0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
1ef0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
1f00: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
1f10: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
1f20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
1f30: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
1f40: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1f50: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
1f60: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
1f70: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
1f80: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
1f90: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
1fa0: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
1fb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1fc0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
1fd0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
1fe0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
1ff0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
2000: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2010: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2020: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2030: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2040: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2050: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2060: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2070: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2080: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2090: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
20a0: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
20b0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
20c0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
20d0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
20e0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
20f0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
2100: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2110: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2120: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2130: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2140: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2150: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2160: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2170: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2180: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2190: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
21a0: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
21b0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
21c0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21d0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
21e0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
21f0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
2200: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2210: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2220: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2230: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2240: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2250: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2260: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2270: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2280: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2290: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
22a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
22b0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
22c0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
22d0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
22e0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
22f0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
2300: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2310: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2320: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2330: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2340: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2350: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2360: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2370: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2380: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2390: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
23a0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
23b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
23c0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
23d0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
23e0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
23f0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
2400: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2410: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2420: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2430: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2440: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2450: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2460: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2470: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2480: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2490: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
24a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
24c0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
24d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
24e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
24f0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
2500: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2510: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2520: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2530: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2550: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2560: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2570: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2580: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2590: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
25a0: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
25b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
25c0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
25d0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
25e0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
25f0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
2600: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2610: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2620: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2630: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2640: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2650: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2660: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2670: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2680: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2690: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
26a0: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
26b0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
26c0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
26d0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
26e0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
26f0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2700: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2710: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2720: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2730: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2740: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2750: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2760: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2770: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2780: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2790: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
27a0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27b0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
27c0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
27d0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
27e0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
27f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2800: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2810: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2820: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2830: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2840: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2850: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2870: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2880: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2890: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
28a0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
28b0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
28c0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
28d0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
28e0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
28f0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2900: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2910: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2920: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2930: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2940: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2950: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2960: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2970: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2980: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2990: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
29a0: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
29b0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
29c0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
29d0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
29e0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
29f0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2a00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2a10: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2a20: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2a30: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2a40: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2a60: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2a70: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2a80: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2a90: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2aa0: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ab0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2ac0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ad0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ae0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2af0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2b00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2b10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2b20: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2b30: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2b40: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2b50: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2b60: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2b70: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2b80: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2b90: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2ba0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2bb0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2bc0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2bd0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2be0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2bf0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c00: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
2c10: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
2c20: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
2c30: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
2c40: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
2c50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
2c60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
2c80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
2c90: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 65 78  inter to a subex
2ca0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 70 56 65 63  pression of pVec
2cb0: 74 6f 72 20 74 68 61 74 20 69 73 20 74 68 65 20  tor that is the 
2cc0: 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  i-th.** column o
2cd0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 28 6e 75  f the vector (nu
2ce0: 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
2cf0: 77 69 74 68 20 30 29 2e 20 20 54 68 65 20 63 61  with 0).  The ca
2d00: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73  ller must.** ens
2d10: 75 72 65 20 74 68 61 74 20 69 20 69 73 20 77 69  ure that i is wi
2d20: 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a  thin range..**.*
2d30: 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20  * If pVector is 
2d40: 72 65 61 6c 6c 79 20 61 20 73 63 61 6c 61 72 20  really a scalar 
2d50: 28 61 6e 64 20 22 73 63 61 6c 61 72 22 20 68 65  (and "scalar" he
2d60: 72 65 20 69 6e 63 6c 75 64 65 73 20 73 75 62 71  re includes subq
2d70: 75 65 72 69 65 73 0a 2a 2a 20 74 68 61 74 20 72  ueries.** that r
2d80: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 63  eturn a single c
2d90: 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20 72 65 74  olumn!) then ret
2da0: 75 72 6e 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f  urn pVector unmo
2db0: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56  dified..**.** pV
2dc0: 65 63 74 6f 72 20 72 65 74 61 69 6e 73 20 6f 77  ector retains ow
2dd0: 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 72  nership of the r
2de0: 65 74 75 72 6e 65 64 20 73 75 62 65 78 70 72 65  eturned subexpre
2df0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
2e00: 74 68 65 20 76 65 63 74 6f 72 20 69 73 20 61 20  the vector is a 
2e10: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65  (SELECT ...) the
2e20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2e30: 20 72 65 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20   returned is.** 
2e40: 6a 75 73 74 20 74 68 65 20 65 78 70 72 65 73 73  just the express
2e50: 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 2d 74 68  ion for the i-th
2e60: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
2e70: 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 6d 61 79  ult set, and may
2e80: 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65 61 64 79  .** not be ready
2e90: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6f 6e 20   for evaluation 
2ea0: 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c  because the tabl
2eb0: 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
2ec0: 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73   yet.** been pos
2ed0: 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72  itioned..*/.Expr
2ee0: 20 2a 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46   *sqlite3VectorF
2ef0: 69 65 6c 64 53 75 62 65 78 70 72 28 45 78 70 72  ieldSubexpr(Expr
2f00: 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e 74 20 69   *pVector, int i
2f10: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73  ){.  assert( i<s
2f20: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
2f30: 53 69 7a 65 28 70 56 65 63 74 6f 72 29 20 29 3b  Size(pVector) );
2f40: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
2f50: 70 72 49 73 56 65 63 74 6f 72 28 70 56 65 63 74  prIsVector(pVect
2f60: 6f 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  or) ){.    asser
2f70: 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d  t( pVector->op2=
2f80: 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f  =0 || pVector->o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 3b 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f  ;.    if( pVecto
2fb0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
2fc0: 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32   || pVector->op2
2fd0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2fe0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
2ff0: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
3000: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3010: 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
3020: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
3030: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
3040: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a  i].pExpr;.    }.
3050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56 65    }.  return pVe
3060: 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ctor;.}.#endif /
3070: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
3080: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
3090: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
30a0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
30b0: 59 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  Y./*.** Compute 
30c0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
30d0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 77 68 69   Expr object whi
30e0: 63 68 20 77 68 65 6e 20 70 61 73 73 65 64 20 74  ch when passed t
30f0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  o.** sqlite3Expr
3100: 43 6f 64 65 28 29 20 77 69 6c 6c 20 67 65 6e 65  Code() will gene
3110: 72 61 74 65 20 61 6c 6c 20 6e 65 63 65 73 73 61  rate all necessa
3120: 72 79 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  ry code to compu
3130: 74 65 0a 2a 2a 20 74 68 65 20 69 46 69 65 6c 64  te.** the iField
3140: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  -th column of th
3150: 65 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73  e vector express
3160: 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a  ion pVector..**.
3170: 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66 6f 72 20  ** It is ok for 
3180: 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 61 20  pVector to be a 
3190: 73 63 61 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20  scalar (as long 
31a0: 61 73 20 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20  as iField==0).  
31b0: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65  .** In that case
31c0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  , this routine w
31d0: 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65  orks like sqlite
31e0: 33 45 78 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a  3ExprDup()..**.*
31f0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e  * The caller own
3200: 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  s the returned E
3210: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  xpr object and i
3220: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
3230: 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74 68  r.** ensuring th
3240: 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
3250: 76 61 6c 75 65 20 65 76 65 6e 74 75 61 6c 6c 79  value eventually
3260: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a   gets freed..**.
3270: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 72 65  ** The caller re
3280: 74 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20  tains ownership 
3290: 6f 66 20 70 56 65 63 74 6f 72 2e 20 20 49 66 20  of pVector.  If 
32a0: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
32b0: 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20  SELECT,.** then 
32c0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
32d0: 65 63 74 20 77 69 6c 6c 20 72 65 66 65 72 65 6e  ect will referen
32e0: 63 65 20 70 56 65 63 74 6f 72 20 61 6e 64 20 73  ce pVector and s
32f0: 6f 20 70 56 65 63 74 6f 72 20 6d 75 73 74 20 72  o pVector must r
3300: 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66  emain.** valid f
3310: 6f 72 20 74 68 65 20 6c 69 66 65 20 6f 66 20 74  or the life of t
3320: 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
3330: 63 74 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20  ct.  If pVector 
3340: 69 73 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  is a TK_VECTOR.*
3350: 2a 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78  * or a scalar ex
3360: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69  pression, then i
3370: 74 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  t can be deleted
3380: 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 69 73   as soon as this
3390: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
33a0: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69  rns..**.** A tri
33b0: 63 6b 20 74 6f 20 63 61 75 73 65 20 61 20 54 4b  ck to cause a TK
33c0: 5f 53 45 4c 45 43 54 20 70 56 65 63 74 6f 72 20  _SELECT pVector 
33d0: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74 6f  to be deleted to
33e0: 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 74  gether with.** t
33f0: 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72  he returned Expr
3400: 20 6f 62 6a 65 63 74 20 69 73 20 74 6f 20 61 74   object is to at
3410: 74 61 63 68 20 74 68 65 20 70 56 65 63 74 6f 72  tach the pVector
3420: 20 74 6f 20 74 68 65 20 70 52 69 67 68 74 20 66   to the pRight f
3430: 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72  ield.** of the r
3440: 65 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43  eturned TK_SELEC
3450: 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62  T_COLUMN Expr ob
3460: 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ject..*/.Expr *s
3470: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
3480: 74 6f 72 46 69 65 6c 64 28 0a 20 20 50 61 72 73  torField(.  Pars
3490: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
34a0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
34b0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
34c0: 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a  Vector,       /*
34d0: 20 54 68 65 20 76 65 63 74 6f 72 2e 20 20 4c 69   The vector.  Li
34e0: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
34f0: 73 20 6f 72 20 61 20 73 75 62 2d 53 45 4c 45 43  s or a sub-SELEC
3500: 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c  T */.  int iFiel
3510: 64 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  d           /* W
3520: 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  hich column of t
3530: 68 65 20 76 65 63 74 6f 72 20 74 6f 20 72 65 74  he vector to ret
3540: 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  urn */.){.  Expr
3550: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 56   *pRet;.  if( pV
3560: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  ector->op==TK_SE
3570: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
3580: 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61  rt( pVector->fla
3590: 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
35a0: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t );.    /* The 
35b0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
35c0: 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20   Expr node:.    
35d0: 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a  **.    ** pLeft:
35e0: 20 20 20 20 20 20 20 20 20 20 20 70 56 65 63 74             pVect
35f0: 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b  or containing TK
3600: 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65  _SELECT.  Not de
3610: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52  leted..    ** pR
3620: 69 67 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e  ight:          n
3630: 6f 74 20 75 73 65 64 2e 20 20 42 75 74 20 72 65  ot used.  But re
3640: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
3650: 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d  d..    ** iColum
3660: 6e 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65 78  n:         Index
3670: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
3680: 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69  pVector.    ** i
3690: 54 61 62 6c 65 3a 20 20 20 20 20 20 20 20 20 20  Table:          
36a0: 30 20 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20  0 or the number 
36b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68  of columns on th
36c0: 65 20 4c 48 53 20 6f 66 20 61 6e 20 61 73 73 69  e LHS of an assi
36d0: 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c  gnment.    ** pL
36e0: 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46  eft->iTable:   F
36f0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3700: 20 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f 6c   of register hol
3710: 64 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72 20  ding result, or 
3720: 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
3730: 20 20 20 20 20 20 20 20 20 20 69 66 20 74 68 65            if the
3740: 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 79   result is not y
3750: 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20  et computed..   
3760: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   **.    ** sqlit
3770: 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 20 73  e3ExprDelete() s
3780: 70 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69 70  pecifically skip
3790: 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
37a0: 64 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a  delete of.    **
37b0: 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c   pLeft on TK_SEL
37c0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
37d0: 2e 20 20 42 75 74 20 70 52 69 67 68 74 20 69 73  .  But pRight is
37e0: 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56   followed, so pV
37f0: 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e  ector.    ** can
3800: 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f 20   be attached to 
3810: 70 52 69 67 68 74 20 74 6f 20 63 61 75 73 65 20  pRight to cause 
3820: 74 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b  this node to tak
3830: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a 20  e ownership of. 
3840: 20 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20     ** pVector.  
3850: 54 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65 20  Typically there 
3860: 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65  will be multiple
3870: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3880: 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77  N nodes.    ** w
3890: 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c 65  ith the same pLe
38a0: 66 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ft pointer to th
38b0: 65 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20 6f  e pVector, but o
38c0: 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a  nly one of them.
38d0: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20      ** will own 
38e0: 74 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20 20  the pVector..   
38f0: 20 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20 73   */.    pRet = s
3900: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
3910: 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  se, TK_SELECT_CO
3920: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
3930: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
3940: 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e     pRet->iColumn
3950: 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20 20 20 20   = iField;.     
3960: 20 70 52 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70   pRet->pLeft = p
3970: 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Vector;.    }.  
3980: 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d    assert( pRet==
3990: 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c  0 || pRet->iTabl
39a0: 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  e==0 );.  }else{
39b0: 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f 72  .    if( pVector
39c0: 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ->op==TK_VECTOR 
39d0: 29 20 70 56 65 63 74 6f 72 20 3d 20 70 56 65 63  ) pVector = pVec
39e0: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
39f0: 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20  iField].pExpr;. 
3a00: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
3a10: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
3a20: 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c 20 30 29  >db, pVector, 0)
3a30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3a40: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
3a50: 20 21 64 65 66 69 6e 65 28 53 51 4c 49 54 45 5f   !define(SQLITE_
3a60: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a  OMIT_SUBQUERY) *
3a70: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  /../*.** If expr
3a80: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
3a90: 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43  of type TK_SELEC
3aa0: 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
3ab0: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
3ac0: 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72  it. Return the r
3ad0: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
3ae0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
3af0: 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68  tored (or, if th
3b00: 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
3b10: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3b20: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74  an one column, t
3b30: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
3b40: 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73  rray.** of regis
3b50: 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68  ters in which th
3b60: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3b70: 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ed)..**.** If pE
3b80: 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f  xpr is not a TK_
3b90: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
3ba0: 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  n, return 0..*/.
3bb0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
3bc0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
3bd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3be0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
3bf0: 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  reg = 0;.#ifndef
3c00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3c10: 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
3c20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
3c30: 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71   ){.    reg = sq
3c40: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
3c50: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
3c60: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
3c70: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
3c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
3c90: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
3ca0: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
3cb0: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
3cc0: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
3cd0: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
3ce0: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
3cf0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
3d00: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
3d10: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
3d20: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
3d30: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
3d40: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
3d50: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
3d60: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
3d70: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
3d80: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
3d90: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
3da0: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
3db0: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
3dc0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3dd0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
3de0: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
3df0: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
3e00: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
3e10: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
3e20: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
3e30: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3e40: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
3e50: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
3e60: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
3e70: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
3e80: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
3e90: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3ea0: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
3eb0: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
3ec0: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
3ed0: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
3ee0: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
3ef0: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
3f00: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3f10: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
3f20: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
3f30: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
3f40: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
3f50: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
3f60: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
3f70: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
3f80: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
3f90: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
3fa0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
3fb0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
3fc0: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
3fd0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
3fe0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
3ff0: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
4000: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4020: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
4030: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
4040: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
4050: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
4060: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
4070: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4080: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
40a0: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
40b0: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
40c0: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
40f0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4100: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
4110: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
4120: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
4130: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
4140: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
4150: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
4160: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
4170: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4180: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4190: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
41a0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
41b0: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
41c0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
41d0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
41e0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
41f0: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
4200: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
4210: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
4220: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
4230: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
4240: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
4250: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
4260: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
4270: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4280: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4290: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
42a0: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
42b0: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
42c0: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
42d0: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
42e0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
42f0: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
4300: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
4310: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
4320: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
4330: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
4340: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
4350: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
4360: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
4370: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4380: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4390: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
43a0: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
43b0: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
43c0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
43d0: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
43e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
43f0: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
4400: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
4410: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
4420: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4430: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
4440: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
4450: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4460: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4470: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4480: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4490: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
44a0: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
44c0: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
44d0: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
44e0: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
44f0: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
4500: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4510: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
4520: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
4530: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
4540: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4550: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
4560: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
4570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4580: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4590: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
45a0: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
45b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
45c0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
45d0: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45f0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
4600: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
4610: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4620: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
4630: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
4640: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
4650: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
4660: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
4670: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4680: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4690: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
46a0: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
46b0: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
46c0: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
46d0: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
46e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
46f0: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28  Label(v);..  if(
4700: 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45   nLeft!=sqlite3E
4710: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
4720: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
4730: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4740: 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
4750: 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72  misused");.    r
4760: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
4770: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4780: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4790: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
47a0: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
47b0: 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IS || pExpr->
47c0: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20  op==TK_ISNOT .  
47d0: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
47e0: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70  p==TK_LT || pExp
47f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20  r->op==TK_GT .  
4800: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4810: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70  p==TK_LE || pExp
4820: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20  r->op==TK_GE .  
4830: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
4840: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70  pr->op==op || (p
4850: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
4860: 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20  && op==TK_EQ).  
4870: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45            || (pE
4880: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4890: 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20  T && op==TK_NE) 
48a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d  );.  assert( p5=
48b0: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21  =0 || pExpr->op!
48c0: 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =op );.  assert(
48d0: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
48e0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
48f0: 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20  =op );..  p5 |= 
4900: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a  SQLITE_STOREP2;.
4910: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45    if( opx==TK_LE
4920: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a   ) opx = TK_LT;.
4930: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45    if( opx==TK_GE
4940: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a   ) opx = TK_GT;.
4950: 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70  .  regLeft = exp
4960: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
4970: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
4980: 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72   regRight = expr
4990: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
49a0: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a  arse, pRight);..
49b0: 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c    for(i=0; 1 /*L
49c0: 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72  oop exits by "br
49d0: 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20  eak"*/; i++){.  
49e0: 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
49f0: 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30   0, regFree2 = 0
4a00: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20  ;.    Expr *pL, 
4a10: 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31  *pR; .    int r1
4a20: 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74  , r2;.    assert
4a30: 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66  ( i>=0 && i<nLef
4a40: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30  t );.    if( i>0
4a50: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61   ) sqlite3ExprCa
4a60: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
4a70: 0a 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65  .    r1 = exprVe
4a80: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4a90: 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72  rse, pLeft, i, r
4aa0: 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65  egLeft, &pL, &re
4ab0: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20  gFree1);.    r2 
4ac0: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4ad0: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69  ster(pParse, pRi
4ae0: 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74  ght, i, regRight
4af0: 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32  , &pR, &regFree2
4b00: 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  );.    codeCompa
4b10: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
4b20: 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20  R, opx, r1, r2, 
4b30: 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74  dest, p5);.    t
4b40: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4b50: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4b60: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4b70: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b80: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4b90: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4ba0: 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Le);.    testc
4bb0: 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
4bc0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4bd0: 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
4be0: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4bf0: 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
4c00: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
4c10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4c20: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
4c30: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4c40: 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73  =OP_Eq);.    tes
4c50: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
4c60: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4c70: 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
4c80: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4c90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4ca0: 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20   regFree1);.    
4cb0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4cc0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4cd0: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28  gFree2);.    if(
4ce0: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4cf0: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4d00: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  e);.    if( i==n
4d10: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4d20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4d30: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
4d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4d50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4d60: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
4d70: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
4d80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4d90: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4da0: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
4db0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
4dc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4dd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4de0: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4df0: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4e00: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
4e10: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4e20: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
4e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
4e40: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
4e50: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
4e60: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
4e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
4e90: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
4ea0: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
4eb0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4ec0: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
4ed0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4ee0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
4ef0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4f00: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4f10: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
4f20: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4f30: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
4f40: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4f50: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
4f60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4f70: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4f80: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
4f90: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
4fa0: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
4fb0: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
4fc0: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
4fd0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
4fe0: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
4ff0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
5000: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
5010: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
5020: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5030: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
5040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5050: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
5060: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
5070: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5080: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5090: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
50a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
50b0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
50c0: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
50d0: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
50e0: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
50f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5100: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5110: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
5120: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
5130: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
5140: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
5150: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5160: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
5170: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5180: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5190: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
51a0: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
51b0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
51c0: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
51d0: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
51e0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
51f0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5200: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5210: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5220: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
5230: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
5240: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
5250: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
5260: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
5270: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5280: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5290: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
52a0: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
52b0: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
52c0: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
52d0: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
52e0: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
52f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5300: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5310: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5320: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5330: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
5340: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
5350: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
5360: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
5370: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5380: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5390: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
53a0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
53b0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
53c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
53d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
53e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
53f0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5400: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5410: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
5420: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5430: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
5440: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
5450: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
5460: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
5470: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
5480: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5490: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
54a0: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
54b0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
54c0: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
54d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54e0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
54f0: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
5500: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5510: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
5520: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5530: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5540: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
5550: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5560: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5570: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5580: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5590: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
55a0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
55b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
55c0: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
55d0: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
55e0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
55f0: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
5600: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
5610: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
5620: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
5630: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
5640: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
5650: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
5660: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
5670: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
5680: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
5690: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
56a0: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
56b0: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
56c0: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  plus one..**.** 
56d0: 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45  Also propagate E
56e0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
56f0: 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78  s up from Expr.x
5700: 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66  .pList to Expr.f
5710: 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72  lags,.** if appr
5720: 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
5730: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
5740: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
5750: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
5760: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
5770: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
5780: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5790: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
57a0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
57b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
57c0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
57d0: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
57e0: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
57f0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
5800: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5810: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
5820: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5830: 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48  (p->x.pList, &nH
5840: 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66  eight);.    p->f
5850: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5860: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5870: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5880: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
5890: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
58a0: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
58b0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
58c0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
58d0: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
58e0: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
58f0: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
5900: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5910: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
5920: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
5930: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
5940: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
5950: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  pParse..**.** Al
5960: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c  so propagate all
5970: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5980: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5990: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
59a0: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
59b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
59c0: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
59d0: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
59e0: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
59f0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
5a00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72  ) return;.  expr
5a10: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
5a20: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
5a30: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
5a40: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
5a50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5a60: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5a70: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5a80: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5a90: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
5aa0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
5ab0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
5ac0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5ad0: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5ae0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5af0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5b00: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5b10: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5b20: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5b30: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f  ;.}.#else /* ABO
5b40: 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f  VE:  Height enfo
5b50: 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e  rcement enabled.
5b60: 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20    BELOW: Height 
5b70: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20  enforcement off 
5b80: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61  */./*.** Propaga
5b90: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5ba0: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5bb0: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5bc0: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5bd0: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5be0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5bf0: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5c00: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5c10: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
5c20: 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70  >x.pList && !Exp
5c30: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5c40: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5c50: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5c60: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5c70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c80: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5c90: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5ca0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
5cb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5cc0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
5cd0: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
5ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
5cf0: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
5d00: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
5d10: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
5d20: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
5d30: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
5d40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
5d50: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
5d60: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
5d70: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
5d80: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
5d90: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
5da0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5db0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
5dc0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
5dd0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
5de0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
5df0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
5e00: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
5e10: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
5e20: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
5e30: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
5e40: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
5e50: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
5e60: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
5e70: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
5e80: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ing is performed
5e90: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
5ea0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
5eb0: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
5ec0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
5ed0: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
5ee0: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
5ef0: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
5f00: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
5f10: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
5f20: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
5f30: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
5f40: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
5f50: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
5f60: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
5f70: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
5f80: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
5f90: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
5fa0: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5fb0: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
5fc0: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
5fd0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
5fe0: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
5ff0: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
6000: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
6010: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
6020: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
6030: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
6040: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
6050: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
6060: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
6070: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
6080: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
6090: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
60a0: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
60b0: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
60c0: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
60d0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
60e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
60f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6100: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6110: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20  DbMallocRawNN() 
6120: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6140: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
6150: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
6160: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
6170: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6180: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6190: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
61a0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
61b0: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
61c0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
61d0: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
61e0: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
61f0: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lue = 0;..  asse
6200: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
6210: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
6220: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
6230: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
6240: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
6250: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
6260: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
6270: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
6280: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
6290: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
62a0: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
62b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
62c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
62d0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
62e0: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
62f0: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
6300: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
6310: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
6320: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
6330: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
6340: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
6350: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
6360: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
6370: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
6380: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6390: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
63a0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
63b0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
63c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
63d0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
63e0: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
63f0: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6400: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6410: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6420: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6430: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6440: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6450: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
6460: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
6470: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6480: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
6490: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
64a0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
64b0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
64c0: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
64d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
64e0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
64f0: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6500: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6510: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6520: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6530: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6550: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
6560: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
6570: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
6580: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
6590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
65a0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
65b0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
65c0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
65d0: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
65e0: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
65f0: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6600: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6610: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6620: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6640: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6650: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
6660: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
6670: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
6680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
6690: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
66a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
66b0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
66c0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
66d0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
66e0: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
66f0: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6700: 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f    x.n = zToken ?
6710: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6720: 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20  (zToken) : 0;.  
6730: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
6740: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20  prAlloc(db, op, 
6750: 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &x, 0);.}../*.**
6760: 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73   Attach subtrees
6770: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
6780: 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f  t to the Expr no
6790: 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  de pRoot..**.** 
67a0: 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74  If pRoot==NULL t
67b0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
67c0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
67d0: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
67e0: 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61  urred..** In tha
67f0: 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74  t case, delete t
6800: 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  he subtrees pLef
6810: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f  t and pRight..*/
6820: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
6830: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
6840: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
6850: 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20    Expr *pRoot,. 
6860: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20   Expr *pLeft,.  
6870: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
6880: 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29    if( pRoot==0 )
6890: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
68a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
68b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
68c0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
68d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
68e0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
68f0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6900: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29      if( pRight )
6910: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
6920: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
6930: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
6940: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
6950: 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61  te & pRight->fla
6960: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  gs;.    }.    if
6970: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ( pLeft ){.     
6980: 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20   pRoot->pLeft = 
6990: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f  pLeft;.      pRo
69a0: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
69b0: 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66  Propagate & pLef
69c0: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
69d0: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
69e0: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
69f0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6a00: 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69  an Expr node whi
6a10: 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79  ch joins as many
6a20: 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73   as two subtrees
6a30: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62  ..**.** One or b
6a40: 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72  oth of the subtr
6a50: 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ees can be NULL.
6a60: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
6a70: 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  er to the new.**
6a80: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c   Expr node.  Or,
6a90: 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
6aa0: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61   occurs, set pPa
6ab0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6ac0: 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74  ailed,.** free t
6ad0: 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20  he subtrees and 
6ae0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6af0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
6b00: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
6b10: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6b20: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6b30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6b50: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6b60: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
6b70: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
6b80: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
6b90: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
6ba0: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
6bb0: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
6bc0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
6bd0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
6be0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
6bf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
6c00: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
6c10: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
6c20: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
6c30: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
6c40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
6c50: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
6c60: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
6c80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6c90: 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
6ca0: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
6cb0: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
6cc0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
6cd0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6ce0: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20 26      p->op = op &
6cf0: 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20   TKFLG_MASK;.   
6d00: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
6d10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6d20: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
6d30: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
6d40: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
6d50: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
6d60: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
6d70: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
6d80: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
6d90: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
6da0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
6db0: 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20   pSelect to the 
6dc0: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66  Expr.x.pSelect f
6dd0: 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45  ield.  Or, if pE
6de0: 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65  xpr is NULL (due
6df0: 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20  .** do a memory 
6e00: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
6e10: 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20  re) then delete 
6e20: 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65  the pSelect obje
6e30: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
6e40: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
6e50: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6e60: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65   Expr *pExpr, Se
6e70: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
6e80: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
6e90: 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
6ea0: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
6eb0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
6ec0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
6ed0: 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65  Select|EP_Subque
6ee0: 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
6ef0: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
6f00: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45  Flags(pParse, pE
6f10: 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xpr);.  }else{. 
6f20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
6f30: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6f40: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
6f50: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
6f60: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65  Parse->db, pSele
6f70: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
6f80: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
6f90: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
6fa0: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
6fb0: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
6fc0: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
6fd0: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
6fe0: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
6ff0: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
7000: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
7010: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
7020: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
7030: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
7040: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
7050: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
7060: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
7070: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
7080: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
7090: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
70a0: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
70b0: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
70c0: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
70d0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
70e0: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
70f0: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
7100: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
7110: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
7120: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
7130: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
7140: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
7150: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
7160: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
7170: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
7180: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
7190: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
71a0: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
71b0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
71c0: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
71d0: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
71e0: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
71f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
7200: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
7210: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
7220: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
7230: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
7240: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
7250: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
7260: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
7270: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7280: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
7290: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
72a0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
72b0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
72c0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
72d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
72e0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
72f0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
7300: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7310: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
7320: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
7330: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
7340: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
7350: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
7360: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
7370: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
7380: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
7390: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
73a0: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
73b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
73c0: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
73d0: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
73e0: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
73f0: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
7400: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
7410: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
7420: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
7430: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
7440: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
7450: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
7460: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7470: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
7480: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
7490: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
74a0: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
74b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
74c0: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
74d0: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
74e0: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
74f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
7500: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
7510: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
7520: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
7530: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7540: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
7550: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
7560: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
7570: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7580: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
7590: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
75a0: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
75b0: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
75c0: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
75d0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
75e0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
75f0: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
7600: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
7610: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
7620: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
7630: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
7640: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
7650: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
7660: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
7670: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
7680: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
7690: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
76a0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
76b0: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
76c0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
76d0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
76e0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
76f0: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
7700: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7710: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
7720: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
7730: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7740: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
7750: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
7760: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
7770: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7780: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
7790: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
77a0: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
77b0: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
77c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
77d0: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
77e0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
77f0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7800: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
7810: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
7820: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
7830: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
7840: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e, pNew);.  retu
7850: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7860: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
7870: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7880: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7890: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
78a0: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
78b0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
78c0: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
78d0: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
78e0: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
78f0: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7900: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7910: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
7920: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
7930: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7940: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
7950: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
7960: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
7970: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7980: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7990: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
79a0: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
79b0: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
79c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
79d0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
79e0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
79f0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7a00: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7a10: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
7a20: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
7a30: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
7a40: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
7a50: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
7a60: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
7a70: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7a80: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7a90: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7aa0: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7ab0: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7ac0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7ad0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7ae0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7af0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7b00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7b10: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7b20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7b30: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7b50: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7b60: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7b70: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7b80: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7b90: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7ba0: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7bb0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7bc0: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7bd0: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7be0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7bf0: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7c00: 73 73 65 72 74 28 20 6e 3d 3d 73 71 6c 69 74 65  ssert( n==sqlite
7c10: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a  3Strlen30(z) );.
7c20: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b    if( z[1]==0 ){
7c30: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
7c40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
7c50: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
7c60: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
7c70: 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
7c80: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20  ( z[0]=='?' );. 
7c90: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
7ca0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
7cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
7cc0: 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20   doAdd = 0;.    
7cd0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
7ce0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
7cf0: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7d00: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
7d10: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
7d20: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
7d30: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
7d40: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7d50: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
7d60: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20       int bOk;.  
7d70: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20      if( n==2 ){ 
7d80: 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
7d90: 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20  F-TRUE*/.       
7da0: 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20   i = z[1]-'0';  
7db0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
7dc0: 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73  se of ?N for a s
7dd0: 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f  ingle digit N */
7de0: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
7df0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7e00: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d         bOk = 0==
7e10: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a  sqlite3Atoi64(&z
7e20: 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51  [1], &i, n-1, SQ
7e30: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
7e40: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
7e50: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
7e60: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
7e70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7e80: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7e90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7ea0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
7eb0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7ec0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7ed0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7ee0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7ef0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
7f00: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
7f10: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7f20: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
7f30: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
7f40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7f50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
7f60: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
7f70: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
7f80: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
7f90: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
7fa0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7fb0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
7fc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7fe0: 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20  x = (ynVar)i;.  
7ff0: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
8000: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
8010: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
8020: 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20   (int)x;.       
8030: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
8040: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
8050: 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
8060: 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
8070: 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , x)==0 ){.     
8080: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8090: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
80a0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
80b0: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
80c0: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
80d0: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
80e0: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
80f0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
8100: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
8110: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
8120: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
8130: 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  name.      ** ha
8140: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
8150: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
8160: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8170: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f   number.      */
8180: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8190: 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61  r)sqlite3VListNa
81a0: 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e  meToNum(pParse->
81b0: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20  pVList, z, n);. 
81c0: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b       if( x==0 ){
81d0: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e  .        x = (yn
81e0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
81f0: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f  Var);.        do
8200: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
8210: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
8220: 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50  oAdd ){.      pP
8230: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73  arse->pVList = s
8240: 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64  qlite3VListAdd(d
8250: 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  b, pParse->pVLis
8260: 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20  t, z, n, x);.   
8270: 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e   }.  }.  pExpr->
8280: 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69  iColumn = x;.  i
8290: 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  f( x>db->aLimit[
82a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
82b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
82c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
82d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
82e0: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
82f0: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
8300: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
8310: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
8320: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
8330: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
8340: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
8350: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
8360: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
8370: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
8380: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
8390: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
83a0: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
83b0: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
83c0: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
83d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
83e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
83f0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
8400: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
8410: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
8420: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
8430: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8440: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
8450: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8460: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
8470: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8480: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
8490: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
84a0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
84b0: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
84c0: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
84d0: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
84e0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
84f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
8500: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8510: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
8520: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
8530: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
8540: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
8550: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8560: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
8570: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8580: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8590: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
85a0: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
85b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
85c0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
85d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
85e0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
85f0: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
8600: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8610: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
8620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
8630: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
8640: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
8650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8660: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8670: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  lete(db, p->x.pL
8680: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
8690: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
86a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
86b0: 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44  oken) ) sqlite3D
86c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
86d0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45  Token);.  if( !E
86e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
86f0: 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a  , EP_Static) ){.
8700: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8710: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
8720: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8730: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
8740: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
8750: 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33 45  if( p ) sqlite3E
8760: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8770: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
8780: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8790: 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  f bytes allocate
87a0: 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  d for the expres
87b0: 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a  sion structure .
87c0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
87d0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
87e0: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
87f0: 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c  one of EXPR_FULL
8800: 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45  SIZE,.** EXPR_RE
8810: 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50  DUCEDSIZE or EXP
8820: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
8830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
8840: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
8850: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78  pr *p){.  if( Ex
8860: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8870: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
8880: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b   return EXPR_TOK
8890: 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66  ENONLYSIZE;.  if
88a0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
88b0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
88c0: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52   ) return EXPR_R
88d0: 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65  EDUCEDSIZE;.  re
88e0: 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49  turn EXPR_FULLSI
88f0: 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ZE;.}../*.** The
8900: 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28   dupedExpr*Size(
8910: 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20  ) routines each 
8920: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
8930: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
8940: 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  red.** to store 
8950: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
8960: 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65  ression or expre
8970: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65  ssion tree.  The
8980: 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68  y differ in.** h
8990: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74  ow much of the t
89a0: 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e  ree is measured.
89b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  .**.**     duped
89c0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
89d0: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c       Size of onl
89e0: 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  y the Expr struc
89f0: 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70  ture .**     dup
8a00: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29  edExprNodeSize()
8a10: 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45         Size of E
8a20: 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20  xpr + space for 
8a30: 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70  token.**     dup
8a40: 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20  edExprSize()    
8a50: 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f         Expr + to
8a60: 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f  ken + subtree co
8a70: 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a  mponents.**.****
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
8ad0: 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  e dupedExprStruc
8ae0: 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e  tSize() function
8af0: 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c   returns two val
8b00: 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  ues OR-ed togeth
8b10: 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65  er:  .** (1) the
8b20: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
8b30: 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68  for a copy of th
8b40: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8b50: 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32   only and .** (2
8b60: 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61  ) the EP_xxx fla
8b70: 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  gs that indicate
8b80: 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74   what the struct
8b90: 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20  ure size should 
8ba0: 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  be..** The retur
8bb0: 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61  n values is alwa
8bc0: 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  ys one of:.**.**
8bd0: 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53        EXPR_FULLS
8be0: 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  IZE.**      EXPR
8bf0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c  _REDUCEDSIZE   |
8c00: 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20   EP_Reduced.**  
8c10: 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e      EXPR_TOKENON
8c20: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
8c30: 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nOnly.**.** The 
8c40: 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75  size of the stru
8c50: 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75  cture can be fou
8c60: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
8c70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
8c80: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
8c90: 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54  e with 0xfff.  T
8ca0: 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20  he flags can be 
8cb0: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
8cc0: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   the.** return v
8cd0: 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64  alue with EP_Red
8ce0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
8cf0: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
8d00: 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45  at with flags==E
8d10: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74  XPRDUP_REDUCE, t
8d20: 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72  his routines wor
8d30: 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a  ks on full-size.
8d40: 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45  ** (unreduced) E
8d50: 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74  xpr objects as t
8d60: 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c  hey or originall
8d70: 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  y constructed by
8d80: 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20   the parser..** 
8d90: 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f  During expressio
8da0: 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72  n analysis, extr
8db0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
8dc0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f   computed and mo
8dd0: 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65  ved into.** late
8de0: 72 20 70 61 72 74 73 20 6f 66 20 74 65 68 20 45  r parts of teh E
8df0: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  xpr object and t
8e00: 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  hat extra inform
8e10: 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20  ation might get 
8e20: 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69  chopped.** off i
8e30: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
8e40: 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f   is reduced.  No
8e50: 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20  te also that it 
8e60: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f  does not work to
8e70: 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52  .** make an EXPR
8e80: 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20  DUP_REDUCE copy 
8e90: 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78 70  of a reduced exp
8ea0: 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20  ression.  It is 
8eb0: 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f  only legal.** to
8ec0: 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74 69   reduce a pristi
8ed0: 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ne expression tr
8ee0: 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  ee from the pars
8ef0: 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65  er.  The impleme
8f00: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75  ntation.** of du
8f10: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
8f20: 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74  e() contain mult
8f30: 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73 74  iple assert() st
8f40: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74  atements that at
8f50: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f  tempt.** to enfo
8f60: 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61  rce this constra
8f70: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
8f80: 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72 75  nt dupedExprStru
8f90: 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  ctSize(Expr *p, 
8fa0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
8fb0: 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  t nSize;.  asser
8fc0: 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  t( flags==EXPRDU
8fd0: 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67  P_REDUCE || flag
8fe0: 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20  s==0 ); /* Only 
8ff0: 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61  one flag value a
9000: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65  llowed */.  asse
9010: 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  rt( EXPR_FULLSIZ
9020: 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73  E<=0xfff );.  as
9030: 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20 28  sert( (0xfff & (
9040: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9050: 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a  kenOnly))==0 );.
9060: 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c    if( 0==flags |
9070: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  | p->op==TK_SELE
9080: 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  CT_COLUMN ){.   
9090: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55   nSize = EXPR_FU
90a0: 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b  LLSIZE;.  }else{
90b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
90c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
90d0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
90e0: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
90f0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9100: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9110: 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20  FromJoin) ); .  
9120: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9130: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9140: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20  _MemToken) );.  
9150: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9160: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9170: 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20  _NoReduce) );.  
9180: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
9190: 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  | p->x.pList ){.
91a0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
91b0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c  PR_REDUCEDSIZE |
91c0: 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20   EP_Reduced;.   
91d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
91e0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
91f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a  =0 );.      nSiz
9200: 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  e = EXPR_TOKENON
9210: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
9220: 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nOnly;.    }.  }
9230: 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b  .  return nSize;
9240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9250: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
9260: 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74  the space in byt
9270: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
9280: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a  tore the copy .*
9290: 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  * of the Expr st
92a0: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f  ructure and a co
92b0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75  py of the Expr.u
92c0: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
92d0: 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e  if that.** strin
92e0: 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a  g is defined.).*
92f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
9300: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45  edExprNodeSize(E
9310: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
9320: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
9330: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
9340: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20  tSize(p, flags) 
9350: 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21  & 0xfff;.  if( !
9360: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9370: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
9380: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
9390: 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73  {.    nByte += s
93a0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
93b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20  ->u.zToken)+1;. 
93c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e   }.  return ROUN
93d0: 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  D8(nByte);.}../*
93e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
93f0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
9400: 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
9410: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
9420: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
9430: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
9440: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9450: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
9460: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61  ument is a.** ma
9470: 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58  sk containing EX
9480: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
9490: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
94a0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
94b0: 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  es space to crea
94c0: 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
94d0: 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20   Expr struct.** 
94e0: 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62  itself and the b
94f0: 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74  uffer referred t
9500: 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  o by Expr.u.zTok
9510: 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  en, if any..**.*
9520: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
9530: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
9540: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65  set, then the re
9550: 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75  turn value inclu
9560: 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f  des .** space to
9570: 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45   duplicate all E
9580: 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  xpr nodes in the
9590: 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20   tree formed by 
95a0: 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61  Expr.pLeft .** a
95b0: 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76  nd Expr.pRight v
95c0: 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f  ariables (but no
95d0: 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74  t for any struct
95e0: 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  ures pointed to 
95f0: 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64  or .** descended
9600: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
9610: 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78  .pList or Expr.x
9620: 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c  .pSelect variabl
9630: 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es)..*/.static i
9640: 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  nt dupedExprSize
9650: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9660: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9670: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
9680: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75  {.    nByte = du
9690: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
96a0: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  p, flags);.    i
96b0: 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50  f( flags&EXPRDUP
96c0: 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  _REDUCE ){.     
96d0: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
96e0: 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74  xprSize(p->pLeft
96f0: 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64  , flags) + duped
9700: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67  ExprSize(p->pRig
9710: 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ht, flags);.    
9720: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9730: 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Byte;.}../*.** T
9740: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9750: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
9760: 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63  e3ExprDup(), exc
9770: 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75  ept that if pzBu
9780: 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  ffer .** is not 
9790: 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66  NULL then *pzBuf
97a0: 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  fer is assumed t
97b0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
97c0: 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
97d0: 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68   .** to store th
97e0: 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  e copy of expres
97f0: 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69  sion p, the copi
9800: 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65  es of p->u.zToke
9810: 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61  n.** (if applica
9820: 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f  ble), and the co
9830: 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70  pies of the p->p
9840: 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67  Left and p->pRig
9850: 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  ht expressions,.
9860: 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72  ** if any. Befor
9870: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
9880: 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f  Buffer is set to
9890: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
98a0: 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74  past the.** port
98b0: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65  ion of the buffe
98c0: 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79  r copied into by
98d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
98e0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
98f0: 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  exprDup(sqlite3 
9900: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
9910: 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a  t dupFlags, u8 *
9920: 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78  *pzBuffer){.  Ex
9930: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
9940: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
9950: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a  return */.  u8 *
9960: 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  zAlloc;         
9970: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63    /* Memory spac
9980: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
9990: 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63  build Expr objec
99a0: 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69  t */.  u32 stati
99b0: 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  cFlag;       /* 
99c0: 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61  EP_Static if spa
99d0: 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  ce not obtained 
99e0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  from malloc */..
99f0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
9a00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
9a10: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46  ;.  assert( dupF
9a20: 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  lags==0 || dupFl
9a30: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9a40: 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UCE );.  assert(
9a50: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
9a60: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
9a70: 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f  P_REDUCE );..  /
9a80: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
9a90: 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
9aa0: 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75  new Expr structu
9ab0: 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42  re. */.  if( pzB
9ac0: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c  uffer ){.    zAl
9ad0: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
9ae0: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
9af0: 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d  = EP_Static;.  }
9b00: 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  else{.    zAlloc
9b10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9b20: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65  ocRawNN(db, dupe
9b30: 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70  dExprSize(p, dup
9b40: 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61  Flags));.    sta
9b50: 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d  ticFlag = 0;.  }
9b60: 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20  .  pNew = (Expr 
9b70: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28  *)zAlloc;..  if(
9b80: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20   pNew ){.    /* 
9b90: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
9ba0: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
9bb0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
9bc0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
9bd0: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
9be0: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
9bf0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
9c00: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
9c10: 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f  r.    ** EXPR_TO
9c20: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f  KENONLYSIZE. nTo
9c30: 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
9c40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
9c50: 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a  s consumed.    *
9c60: 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66  * by the copy of
9c70: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
9c80: 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29   string (if any)
9c90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e  ..    */.    con
9ca0: 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72  st unsigned nStr
9cb0: 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45  uctSize = dupedE
9cc0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
9cd0: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
9ce0: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
9cf0: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
9d00: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e   & 0xfff;.    in
9d10: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  t nToken;.    if
9d20: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9d30: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
9d40: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
9d50: 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  n ){.      nToke
9d60: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
9d70: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
9d80: 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   + 1;.    }else{
9d90: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
9da0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
9db0: 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20   dupFlags ){.   
9dc0: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
9dd0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9de0: 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
9df0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
9e00: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
9e10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9e20: 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20      u32 nSize = 
9e30: 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53  (u32)exprStructS
9e40: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65  ize(p);.      me
9e50: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
9e60: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  nSize);.      if
9e70: 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c  ( nSize<EXPR_FUL
9e80: 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20  LSIZE ){ .      
9e90: 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63    memset(&zAlloc
9ea0: 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52  [nSize], 0, EXPR
9eb0: 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29  _FULLSIZE-nSize)
9ec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ed0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
9ee0: 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54  EP_Reduced, EP_T
9ef0: 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50  okenOnly, and EP
9f00: 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70  _Static flags ap
9f10: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a  propriately. */.
9f20: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9f30: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
9f40: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
9f50: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
9f60: 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  en);.    pNew->f
9f70: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
9f80: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
9f90: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
9fa0: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9fb0: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
9fc0: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
9fd0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
9fe0: 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  ing, if any. */.
9ff0: 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
a000: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
a010: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
a020: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
a030: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
a040: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
a050: 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  Token, p->u.zTok
a060: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
a070: 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   }..    if( 0==(
a080: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
a090: 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b  flags) & (EP_Tok
a0a0: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
a0b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c   ){.      /* Fil
a0c0: 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78  l in the pNew->x
a0d0: 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77  .pSelect or pNew
a0e0: 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72  ->x.pList member
a0f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
a100: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a110: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
a120: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a130: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  >x.pSelect = sql
a140: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
a150: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  , p->x.pSelect, 
a160: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  dupFlags);.     
a170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a180: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
a190: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a1a0: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  up(db, p->x.pLis
a1b0: 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  t, dupFlags);.  
a1c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a1d0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77   /* Fill in pNew
a1e0: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77  ->pLeft and pNew
a1f0: 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ->pRight. */.   
a200: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a210: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
a220: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a230: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c  ly) ){.      zAl
a240: 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72  loc += dupedExpr
a250: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46  NodeSize(p, dupF
a260: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
a270: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a280: 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e  y(pNew, EP_Token
a290: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
a2a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a2b0: 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20  Left = p->pLeft 
a2c0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
a2d0: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a2e0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
a2f0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a300: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a310: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
a320: 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20   = p->pRight ?. 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a350: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50  , p->pRight, EXP
a360: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a370: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a380: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42   }.      if( pzB
a390: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  uffer ){.       
a3a0: 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c   *pzBuffer = zAl
a3b0: 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  loc;.      }.   
a3c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
a3d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a3e0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
a3f0: 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20  ly|EP_Leaf) ){. 
a400: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
a410: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
a420: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
a430: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
a440: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20   p->pLeft;.     
a450: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a460: 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d  iColumn==0 || p-
a470: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
a480: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a490: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c  p->pRight==0  ||
a4a0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70   p->pRight==p->p
a4b0: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Left );.        
a4c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a4d0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
a4e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a4f0: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
a500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a510: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a520: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a530: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30  db, p->pRight, 0
a540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a550: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
a560: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ew;.}../*.** Cre
a570: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
a580: 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68   deep copy of th
a590: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
a5a0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
a5b0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61  * argument. If a
a5c0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
a5d0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
a5e0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
a5f0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e  .** and the db->
a600: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
a610: 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  g set..*/.#ifnde
a620: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
a630: 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77  E.static With *w
a640: 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ithDup(sqlite3 *
a650: 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20  db, With *p){.  
a660: 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a  With *pRet = 0;.
a670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
a680: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
a690: 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70  f(*p) + sizeof(p
a6a0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43  ->a[0]) * (p->nC
a6b0: 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20  te-1);.    pRet 
a6c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
a6d0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
a6e0: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
a6f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a700: 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20       pRet->nCte 
a710: 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20  = p->nCte;.     
a720: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
a730: 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
a740: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53     pRet->a[i].pS
a750: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
a760: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
a770: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29  a[i].pSelect, 0)
a780: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
a790: 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c  a[i].pCols = sql
a7a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
a7b0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c  db, p->a[i].pCol
a7c0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  s, 0);.        p
a7d0: 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  Ret->a[i].zName 
a7e0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a7f0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  p(db, p->a[i].zN
a800: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
a810: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a820: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23   pRet;.}.#else.#
a830: 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28   define withDup(
a840: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  x,y) 0.#endif../
a850: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
a860: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
a870: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
a880: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
a890: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
a8a0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
a8b0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
a8c0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
a8d0: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
a8e0: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
a8f0: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
a900: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
a910: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
a920: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
a930: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
a940: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
a950: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
a960: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
a970: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
a980: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
a990: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
a9a0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
a9b0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
a9c0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
a9d0: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
a9e0: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
a9f0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
aa00: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
aa10: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
aa20: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
aa30: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
aa40: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
aa50: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
aa60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
aa70: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
aa80: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
aa90: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
aaa0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
aab0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
aac0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
aad0: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
aae0: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
aaf0: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
ab00: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
ab10: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
ab20: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
ab30: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
ab40: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
ab50: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
ab60: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
ab70: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
ab80: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
ab90: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
aba0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
abb0: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
abc0: 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
abd0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
abe0: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20  E );.  return p 
abf0: 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  ? exprDup(db, p,
ac00: 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a   flags, 0) : 0;.
ac10: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
ac20: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
ac30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
ac40: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
ac50: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
ac60: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
ac70: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
ac80: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
ac90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
aca0: 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f   *pPriorSelectCo
acb0: 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  l = 0;.  assert(
acc0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
acd0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
ace0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
acf0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
ad00: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  b, .            
ad10: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 2b 73   sizeof(*pNew)+s
ad20: 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 61 5b 30 5d  izeof(pNew->a[0]
ad30: 29 2a 28 70 2d 3e 6e 45 78 70 72 2d 31 29 20 29  )*(p->nExpr-1) )
ad40: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
ad50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
ad60: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4e 65  ew->nAlloc = pNe
ad70: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45  w->nExpr = p->nE
ad80: 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  xpr;.  pItem = p
ad90: 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74  New->a;.  pOldIt
ada0: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
adb0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
adc0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
add0: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
ade0: 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20   Expr *pOldExpr 
adf0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
ae00: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  r;.    Expr *pNe
ae10: 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  wExpr;.    pItem
ae20: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
ae30: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
ae40: 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20  dExpr, flags);. 
ae50: 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20     if( pOldExpr 
ae60: 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70  .     && pOldExp
ae70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
ae80: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20  _COLUMN.     && 
ae90: 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65  (pNewExpr = pIte
aea0: 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20  m->pExpr)!=0 .  
aeb0: 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
aec0: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
aed0: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29  lumn==0 || i>0 )
aee0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
aef0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  Expr->iColumn==0
af00: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
af10: 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c  rt( pOldExpr->pL
af20: 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70  eft==pOldExpr->p
af30: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20  Right );.       
af40: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
af50: 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65   = pNewExpr->pLe
af60: 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ft = pNewExpr->p
af70: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c  Right;.      }el
af80: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
af90: 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
afa0: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
afb0: 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  [-1].pExpr!=0 );
afc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
afd0: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
afe0: 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45  mn==pItem[-1].pE
aff0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29  xpr->iColumn+1 )
b000: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b010: 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f  ( pPriorSelectCo
b020: 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  l==pItem[-1].pEx
b030: 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  pr->pLeft );.   
b040: 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70       pNewExpr->p
b050: 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c  Left = pPriorSel
b060: 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  ectCol;.      }.
b070: 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d      }.    pItem-
b080: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
b090: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b0a0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
b0b0: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
b0c0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b0d0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b0e0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
b0f0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
b100: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
b110: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  er;.    pItem->d
b120: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  one = 0;.    pIt
b130: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  em->bSpanIsTab =
b140: 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e   pOldItem->bSpan
b150: 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d  IsTab;.    pItem
b160: 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ->u = pOldItem->
b170: 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  u;.  }.  return 
b180: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
b190: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
b1a0: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
b1b0: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
b1c0: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
b1d0: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
b1e0: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
b1f0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
b200: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
b210: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b220: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
b230: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
b240: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
b250: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
b260: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
b270: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
b280: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b290: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
b2a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
b2b0: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
b2c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b2d0: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
b2e0: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
b2f0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
b300: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  db, SrcList *p, 
b310: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72  int flags){.  Sr
b320: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
b330: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
b340: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  e;.  assert( db!
b350: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
b360: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
b370: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
b380: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
b390: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
b3a0: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
b3b0: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
b3c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
b3d0: 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  NN(db, nByte );.
b3e0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
b3f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b400: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
b410: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
b420: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b430: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
b440: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
b450: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
b460: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
b470: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
b480: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
b490: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
b4a0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
b4b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65   pNewItem->pSche
b4c0: 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ma = pOldItem->p
b4d0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77  Schema;.    pNew
b4e0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
b4f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b500: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b510: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
b520: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
b530: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b540: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b550: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
b560: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
b570: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b580: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  b, pOldItem->zAl
b590: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
b5a0: 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65  em->fg = pOldIte
b5b0: 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49  m->fg;.    pNewI
b5c0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
b5d0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
b5e0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b5f0: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
b600: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
b610: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
b620: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
b630: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
b640: 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  rn;.    if( pNew
b650: 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
b660: 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e  edBy ){.      pN
b670: 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ewItem->u1.zInde
b680: 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44  xedBy = sqlite3D
b690: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
b6a0: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
b6b0: 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dBy);.    }.    
b6c0: 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pNewItem->pIBInd
b6d0: 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ex = pOldItem->p
b6e0: 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  IBIndex;.    if(
b6f0: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73   pNewItem->fg.is
b700: 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
b710: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46   pNewItem->u1.pF
b720: 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20  uncArg = .      
b730: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
b740: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
b750: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
b760: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
b770: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
b780: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
b790: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
b7a0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
b7b0: 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
b7c0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
b7d0: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
b7e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b7f0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b800: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
b810: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b820: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
b830: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b840: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
b850: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
b860: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
b870: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
b880: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
b890: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
b8a0: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
b8b0: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
b8c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
b8d0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
b8e0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
b8f0: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
b900: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
b910: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
b920: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b930: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b940: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b950: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b960: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
b970: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
b980: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b990: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
b9a0: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
b9b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b9c0: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
b9d0: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
b9e0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
b9f0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
ba00: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
ba10: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
ba20: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
ba30: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
ba40: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
ba50: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
ba60: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
ba70: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
ba80: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
ba90: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
baa0: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
bab0: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
bac0: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
bad0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
bae0: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
baf0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
bb00: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
bb10: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
bb20: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
bb30: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
bb40: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
bb50: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
bb60: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
bb70: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
bb80: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bb90: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
bba0: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
bbb0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
bbc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
bbd0: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
bbe0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
bbf0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
bc00: 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67   *pDup, int flag
bc10: 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52  s){.  Select *pR
bc20: 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74  et = 0;.  Select
bc30: 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53   *pNext = 0;.  S
bc40: 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52  elect **pp = &pR
bc50: 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  et;.  Select *p;
bc60: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
bc70: 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75  0 );.  for(p=pDu
bc80: 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f  p; p; p=p->pPrio
bc90: 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
bca0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
bcb0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
bcc0: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
bcd0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
bce0: 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d  break;.    pNew-
bcf0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
bd00: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
bd10: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
bd20: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53  s);.    pNew->pS
bd30: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
bd40: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
bd50: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rc, flags);.    
bd60: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
bd70: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bd80: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61  , p->pWhere, fla
bd90: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
bda0: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
bdb0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
bdc0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
bdd0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
bde0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
bdf0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
be00: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
be10: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  .    pNew->pOrde
be20: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
be30: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
be40: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
be50: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
be60: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77   p->op;.    pNew
be70: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b  ->pNext = pNext;
be80: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  .    pNew->pPrio
be90: 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  r = 0;.    pNew-
bea0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
beb0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
bec0: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
bed0: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65      pNew->pOffse
bee0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
bef0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
bf00: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
bf10: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  New->iLimit = 0;
bf20: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
bf30: 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  et = 0;.    pNew
bf40: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  ->selFlags = p->
bf50: 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55  selFlags & ~SF_U
bf60: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
bf70: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
bf80: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
bf90: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
bfa0: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
bfb0: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
bfc0: 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow = p->nSelectR
bfd0: 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  ow;.    pNew->pW
bfe0: 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62  ith = withDup(db
bff0: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20  , p->pWith);.   
c000: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
c010: 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a  tName(pNew, p->z
c020: 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 2a 70  SelName);.    *p
c030: 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 70  p = pNew;.    pp
c040: 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f 72   = &pNew->pPrior
c050: 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 4e  ;.    pNext = pN
c060: 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ew;.  }..  retur
c070: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
c080: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
c090: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
c0a0: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
c0b0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
c0c0: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
c0d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
c0e0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
c0f0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
c100: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
c110: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
c120: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
c130: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
c140: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
c150: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
c160: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  t..**.** If a me
c170: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
c180: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
c190: 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73  e entire list is
c1a0: 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55   freed and.** NU
c1b0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
c1c0: 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20   If non-NULL is 
c1d0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69  returned, then i
c1e0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  t is guaranteed.
c1f0: 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
c200: 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73  entry was succes
c210: 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e  sfully appended.
c220: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
c230: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
c240: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
c250: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
c260: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c270: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c280: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
c290: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
c2a0: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
c2b0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
c2c0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
c2d0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
c2e0: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
c2f0: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
c300: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  L */.){.  struct
c310: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c320: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
c330: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c340: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
c350: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
c360: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
c370: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
c380: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c390: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
c3a0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
c3b0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
c3c0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
c3d0: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
c3e0: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
c3f0: 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 65 6c  Alloc = 1;.  }el
c400: 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  se if( pList->nE
c410: 78 70 72 3d 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr==pList->nAll
c420: 6f 63 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  oc ){.    ExprLi
c430: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e  st *pNew;.    pN
c440: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
c450: 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c  alloc(db, pList,
c460: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73   .             s
c470: 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32  izeof(*pList)+(2
c480: 2a 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2d  *pList->nAlloc -
c490: 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74   1)*sizeof(pList
c4a0: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
c4b0: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
c4c0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
c4d0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
c4e0: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73  = pNew;.    pLis
c4f0: 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a  t->nAlloc *= 2;.
c500: 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
c510: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
c520: 45 78 70 72 2b 2b 5d 3b 0a 20 20 6d 65 6d 73 65  Expr++];.  memse
c530: 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
c540: 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 70  of(*pItem));.  p
c550: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
c560: 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  xpr;.  return pL
c570: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
c580: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
c590: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
c5a0: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
c5b0: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
c5c0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
c5d0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
c5e0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
c5f0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
c600: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
c610: 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78 70  Columns and pExp
c620: 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72 20  r form a vector 
c630: 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63 68  assignment which
c640: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
c650: 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66  SET.** clause of
c660: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
c670: 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69 73  ment.  Like this
c680: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28  :.**.**        (
c690: 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c  a,b,c) = (expr1,
c6a0: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20  expr2,expr3).** 
c6b0: 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d  Or:    (a,b,c) =
c6c0: 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46   (SELECT x,y,z F
c6d0: 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  ROM ....).**.** 
c6e0: 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66  For each term of
c6f0: 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73 69   the vector assi
c700: 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e  gnment, append n
c710: 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  ew entries to th
c720: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
c730: 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e 20  list pList.  In 
c740: 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73 75  the case of a su
c750: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 52 48  bquery on the RH
c760: 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f  S, append.** TK_
c770: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78  SELECT_COLUMN ex
c780: 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78  pressions..*/.Ex
c790: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
c7a0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63  xprListAppendVec
c7b0: 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tor(.  Parse *pP
c7c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
c7d0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c7e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c7f0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  pList,       /* 
c800: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
c810: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
c820: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69  e NULL */.  IdLi
c830: 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20  st *pColumns,   
c840: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61     /* List of na
c850: 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74 68  mes of LHS of th
c860: 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a  e assignment */.
c870: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
c880: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74           /* Vect
c890: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  or expression to
c8a0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
c8b0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
c8c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c8d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c8e0: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  int n;.  int i;.
c8f0: 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
c900: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
c910: 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43  xpr : 0;.  /* pC
c920: 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20  olumns can only 
c930: 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61  be NULL due to a
c940: 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d  n OOM but an OOM
c950: 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20   will cause an. 
c960: 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20 74   ** exit prior t
c970: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  o this routine b
c980: 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  eing invoked */.
c990: 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f 6c    if( NEVER(pCol
c9a0: 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20  umns==0) ) goto 
c9b0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
c9c0: 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ror;.  if( pExpr
c9d0: 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  ==0 ) goto vecto
c9e0: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
c9f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53  .  /* If the RHS
ca00: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 74 68   is a vector, th
ca10: 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d 65 64 69  en we can immedi
ca20: 61 74 65 6c 79 20 63 68 65 63 6b 20 74 6f 20 73  ately check to s
ca30: 65 65 20 74 68 61 74 20 0a 20 20 2a 2a 20 74 68  ee that .  ** th
ca40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 52 48  e size of the RH
ca50: 53 20 61 6e 64 20 4c 48 53 20 6d 61 74 63 68 2e  S and LHS match.
ca60: 20 20 42 75 74 20 69 66 20 74 68 65 20 52 48 53    But if the RHS
ca70: 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 0a 20   is a SELECT, . 
ca80: 20 2a 2a 20 77 69 6c 64 63 61 72 64 73 20 28 22   ** wildcards ("
ca90: 2a 22 29 20 69 6e 20 74 68 65 20 72 65 73 75 6c  *") in the resul
caa0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
cab0: 45 43 54 20 6d 75 73 74 20 62 65 20 65 78 70 61  ECT must be expa
cac0: 6e 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a  nded before.  **
cad0: 20 77 65 20 63 61 6e 20 64 6f 20 74 68 65 20 73   we can do the s
cae0: 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f 20 64 65  ize check, so de
caf0: 66 65 72 20 74 68 65 20 73 69 7a 65 20 63 68 65  fer the size che
cb00: 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ck until code ge
cb10: 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  neration..  */. 
cb20: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
cb30: 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 43 6f  TK_SELECT && pCo
cb40: 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73  lumns->nId!=(n=s
cb50: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
cb60: 53 69 7a 65 28 70 45 78 70 72 29 29 20 29 7b 0a  Size(pExpr)) ){.
cb70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
cb80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20  Msg(pParse, "%d 
cb90: 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64  columns assigned
cba0: 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20   %d values",.   
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20   pColumns->nId, 
cbd0: 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63  n);.    goto vec
cbe0: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
cbf0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
cc00: 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49  ; i<pColumns->nI
cc10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  d; i++){.    Exp
cc20: 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73 71  r *pSubExpr = sq
cc30: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
cc40: 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c 20  orField(pParse, 
cc50: 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20 70  pExpr, i);.    p
cc60: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
cc70: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
cc80: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75 62  rse, pList, pSub
cc90: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
cca0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73  List ){.      as
ccb0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
ccc0: 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20 29  pr==iFirst+i+1 )
ccd0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ;.      pList->a
cce0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
ccf0: 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e  .zName = pColumn
cd00: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  s->a[i].zName;. 
cd10: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61       pColumns->a
cd20: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [i].zName = 0;. 
cd30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
cd40: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
cd50: 4c 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b  LECT && pList ){
cd60: 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69 72 73  .    Expr *pFirs
cd70: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69  t = pList->a[iFi
cd80: 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  rst].pExpr;.    
cd90: 61 73 73 65 72 74 28 20 70 46 69 72 73 74 21 3d  assert( pFirst!=
cda0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
cdb0: 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f   pFirst->op==TK_
cdc0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b  SELECT_COLUMN );
cdd0: 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 74  .     .    /* St
cde0: 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ore the SELECT s
cdf0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52 69 67  tatement in pRig
ce00: 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20 62 65  ht so it will be
ce10: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a 20 20   deleted when.  
ce20: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
ce30: 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69 73 20  ListDelete() is 
ce40: 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70 46  called */.    pF
ce50: 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  irst->pRight = p
ce60: 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70 72 20  Expr;.    pExpr 
ce70: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  = 0;..    /* Rem
ce80: 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65 20 6f  ember the size o
ce90: 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69 54 61  f the LHS in iTa
cea0: 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65 20 63  ble so that we c
ceb0: 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a 20 20  an check that.  
cec0: 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61 6e 64    ** the RHS and
ced0: 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74 63 68   LHS sizes match
cee0: 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e   during code gen
cef0: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  eration. */.    
cf00: 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65 20 3d  pFirst->iTable =
cf10: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a   pColumns->nId;.
cf20: 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65    }..vector_appe
cf30: 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  nd_error:.  sqli
cf40: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
cf50: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
cf60: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
cf70: 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20  db, pColumns);. 
cf80: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
cf90: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
cfa0: 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74  sort order for t
cfb0: 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
cfc0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45 78 70  on the given Exp
cfd0: 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rList..*/.void s
cfe0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
cff0: 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c  tSortOrder(ExprL
d000: 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72  ist *p, int iSor
d010: 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70  tOrder){.  if( p
d020: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d030: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53  assert( SQLITE_S
d040: 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26  O_UNDEFINED<0 &&
d050: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d   SQLITE_SO_ASC>=
d060: 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44  0 && SQLITE_SO_D
d070: 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ESC>0 );.  asser
d080: 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  t( p->nExpr>0 );
d090: 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65  .  if( iSortOrde
d0a0: 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  r<0 ){.    asser
d0b0: 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  t( p->a[p->nExpr
d0c0: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53  -1].sortOrder==S
d0d0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a  QLITE_SO_ASC );.
d0e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d0f0: 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d    p->a[p->nExpr-
d100: 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28  1].sortOrder = (
d110: 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d  u8)iSortOrder;.}
d120: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d130: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61  ExprList.a[].zNa
d140: 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  me element of th
d150: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
d160: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
d170: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d180: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
d190: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
d1a0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
d1b0: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61   error.  But pNa
d1c0: 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  me should never 
d1d0: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
d1e0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
d1f0: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
d200: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
d210: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
d220: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
d230: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
d240: 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  etName(.  Parse 
d250: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d260: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d270: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d280: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
d290: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
d2a0: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
d2b0: 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  an. */.  Token *
d2c0: 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
d2d0: 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61   /* Name to be a
d2e0: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  dded */.  int de
d2f0: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
d300: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75    /* True to cau
d310: 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62  se the name to b
d320: 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b  e dequoted */.){
d330: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
d340: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
d350: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
d360: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
d370: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
d380: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
d390: 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Item;.    assert
d3a0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
d3b0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20   );.    pItem = 
d3c0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
d3d0: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
d3e0: 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e  ssert( pItem->zN
d3f0: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49  ame==0 );.    pI
d400: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
d410: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50  ite3DbStrNDup(pP
d420: 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d  arse->db, pName-
d430: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
d440: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 29     if( dequote )
d450: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
d460: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
d470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
d480: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
d490: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
d4a0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
d4b0: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
d4c0: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
d4d0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
d4e0: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
d4f0: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
d500: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
d510: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
d520: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
d530: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
d540: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
d550: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
d560: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
d570: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
d580: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
d590: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
d5a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d5b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d5c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
d5d0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
d5e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
d5f0: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
d600: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70  e span. */.  Exp
d610: 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20  rSpan *pSpan    
d620: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e       /* The span
d630: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
d640: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d650: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d660: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
d670: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
d680: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
d690: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
d6a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d6b0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
d6c0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d6d0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
d6e0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
d6f0: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
d700: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
d710: 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78  ed || pItem->pEx
d720: 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72  pr==pSpan->pExpr
d730: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
d740: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
d750: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
d760: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
d770: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
d780: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
d790: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
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 28 69 6e 74 29             (int)
d7c0: 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70  (pSpan->zEnd - p
d7d0: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a  Span->zStart));.
d7e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
d7f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
d800: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
d810: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
d820: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
d830: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
d840: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
d850: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
d860: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
d870: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
d880: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
d890: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
d8a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
d8b0: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
d8c0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
d8d0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
d8e0: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
d8f0: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
d900: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
d910: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
d920: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
d930: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
d940: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
d950: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
d960: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
d970: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d980: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
d990: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
d9a0: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
d9b0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
d9c0: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
d9d0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ist..*/.static S
d9e0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
d9f0: 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65  oid exprListDele
da00: 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62  teNN(sqlite3 *db
da10: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
da20: 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c  t){.  int i = pL
da30: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74  ist->nExpr;.  st
da40: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
da50: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69  em *pItem =  pLi
da60: 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28  st->a;.  assert(
da70: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
da80: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  );.  do{.    sql
da90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
daa0: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
dab0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
dac0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
dad0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
dae0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
daf0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
db00: 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c  pItem++;.  }whil
db10: 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71  e( --i>0 );.  sq
db20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
db30: 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73  pList);.}.void s
db40: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
db50: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
db60: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
db70: 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  t){.  if( pList 
db80: 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  ) exprListDelete
db90: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
dba0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
dbb0: 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66  he bitwise-OR of
dbc0: 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20   all Expr.flags 
dbd0: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69  fields in the gi
dbe0: 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ven.** ExprList.
dbf0: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45  .*/.u32 sqlite3E
dc00: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e  xprListFlags(con
dc10: 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st ExprList *pLi
dc20: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
dc30: 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66 28  u32 m = 0;.  if(
dc40: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
dc50: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
dc60: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
dc70: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
dc80: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
dc90: 78 70 72 3b 0a 20 20 20 20 20 20 20 61 73 73 65  xpr;.       asse
dca0: 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
dcb0: 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70         m |= pExp
dcc0: 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  r->flags;.    }.
dcd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
dce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72  }../*.** These r
dcf0: 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b  outines are Walk
dd00: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65  er callbacks use
dd10: 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65  d to check expre
dd20: 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65  ssions to.** see
dd30: 20 69 66 20 74 68 65 79 20 61 72 65 20 22 63 6f   if they are "co
dd40: 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65  nstant" for some
dd50: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63   definition of c
dd60: 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a  onstant.  The.**
dd70: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
dd80: 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74  lue determines t
dd90: 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73  he type of "cons
dda0: 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f  tant" we are loo
ddb0: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a  king.** for..**.
ddc0: 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63  ** These callbac
ddd0: 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  k routines are u
dde0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
ddf0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
de00: 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
de10: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
de20: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
de30: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
de40: 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==1.**     sqli
de50: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
de60: 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20  tNotJoin()      
de70: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
de80: 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71  ode==2.**     sq
de90: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
dea0: 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20  Constant()      
deb0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
dec0: 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20  eCode==3.**     
ded0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
dee0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
def0: 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  )        pWalker
df00: 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a  ->eCode==4 or 5.
df10: 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73  **.** In all cas
df20: 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  es, the callback
df30: 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f  s set Walker.eCo
df40: 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69  de=0 and abort i
df50: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
df60: 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  .** is found to 
df70: 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  not be a constan
df80: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  t..**.** The sql
df90: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
dfa0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69  ntOrFunction() i
dfb0: 73 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75  s used for evalu
dfc0: 61 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ating expression
dfd0: 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  s.** in a CREATE
dfe0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
dff0: 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43  .  The Walker.eC
e000: 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35 20 77  ode value is 5 w
e010: 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61  hen parsing.** a
e020: 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  n existing schem
e030: 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f  a and 4 when pro
e040: 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74  cessing a new st
e050: 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e  atement.  A boun
e060: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72  d.** parameter r
e070: 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66  aises an error f
e080: 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74  or new statement
e090: 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74  s, but is silent
e0a0: 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ly converted.** 
e0b0: 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73  to NULL for exis
e0c0: 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54  ting schemas.  T
e0d0: 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74  his allows sqlit
e0e0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
e0f0: 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  that .** contain
e100: 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   a bound paramet
e110: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 79 20  er because they 
e120: 77 65 72 65 20 67 65 6e 65 72 61 74 65 64 20 62  were generated b
e130: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
e140: 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f  .** of SQLite to
e150: 20 62 65 20 70 61 72 73 65 64 20 62 79 20 6e 65   be parsed by ne
e160: 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
e170: 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72  SQLite without r
e180: 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66  aising a.** malf
e190: 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72  ormed schema err
e1a0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
e1b0: 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  t exprNodeIsCons
e1c0: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
e1d0: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
e1e0: 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61  r){..  /* If pWa
e1f0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32  lker->eCode is 2
e200: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
e210: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e220: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
e230: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
e240: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
e250: 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73   a left join dis
e260: 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78  qualifies the ex
e270: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72  pression.  ** fr
e280: 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  om being conside
e290: 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f  red constant. */
e2a0: 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
e2b0: 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72  eCode==2 && Expr
e2c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
e2d0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
e2e0: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
e2f0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
e300: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e310: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
e320: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
e330: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
e340: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
e350: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
e360: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
e370: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
e380: 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c   and either pWal
e390: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
e3a0: 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69   5 or the functi
e3b0: 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a  on has the.    *
e3c0: 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  * SQLITE_FUNC_CO
e3d0: 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20  NST flag. */.   
e3e0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
e3f0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
e400: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c  lker->eCode>=4 |
e410: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
e420: 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74  y(pExpr,EP_Const
e430: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
e440: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
e450: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
e460: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  e{.        pWalk
e470: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
e480: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e490: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
e4a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
e4b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
e4c0: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
e4d0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
e4e0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
e4f0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73  OLUMN:.      tes
e500: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e510: 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20  ==TK_ID );.     
e520: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e530: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
e540: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e550: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
e560: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
e570: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e580: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
e590: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
e5a0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
e5b0: 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70  eCode==3 && pExp
e5c0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
e5d0: 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20  er->u.iCur ){.  
e5e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
e5f0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
e600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e610: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
e620: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
e630: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
e640: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e650: 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20  K_VARIABLE:.    
e660: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
e670: 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20  Code==5 ){.     
e680: 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63     /* Silently c
e690: 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72  onvert bound par
e6a0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70 70  ameters that app
e6b0: 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52  ear inside of CR
e6c0: 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20  EATE.        ** 
e6d0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20  statements into 
e6e0: 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73  a NULL when pars
e6f0: 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 73  ing the CREATE s
e700: 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75  tatement text ou
e710: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  t.        ** of 
e720: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e730: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
e740: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
e750: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65  K_NULL;.      }e
e760: 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  lse if( pWalker-
e770: 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20  >eCode==4 ){.   
e780: 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20       /* A bound 
e790: 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43  parameter in a C
e7a0: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
e7b0: 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
e7c0: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20  from.        ** 
e7d0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
e7e0: 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f  ) causes an erro
e7f0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61  r */.        pWa
e800: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
e810: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e820: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
e830: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
e840: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
e850: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74  default:.      t
e860: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e870: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
e880: 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73   /* selectNodeIs
e890: 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69  Constant will di
e8a0: 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  sallow */.      
e8b0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e8c0: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
e8d0: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
e8e0: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
e8f0: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
e900: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
e910: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
e920: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64  ic int selectNod
e930: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
e940: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
e950: 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ect *NotUsed){. 
e960: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
e970: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57  R(NotUsed);.  pW
e980: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e990: 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ;.  return WRC_A
e9a0: 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bort;.}.static i
e9b0: 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
e9c0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
e9d0: 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b  Flag, int iCur){
e9e0: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
e9f0: 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
ea00: 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f  eof(w));.  w.eCo
ea10: 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20  de = initFlag;. 
ea20: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
ea30: 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
ea40: 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  stant;.  w.xSele
ea50: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
ea60: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
ea70: 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20  t;.  w.u.iCur = 
ea80: 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57  iCur;.  sqlite3W
ea90: 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
eaa0: 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
eab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
eac0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
ead0: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
eae0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
eaf0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
eb00: 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  nt.** and 0 if i
eb10: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
eb20: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
eb30: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   calls..**.** Fo
eb40: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
eb50: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
eb60: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
eb70: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
eb80: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
eb90: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
eba0: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
ebb0: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
ebc0: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
ebd0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
ebe0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ebf0: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a  stant(Expr *p){.
ec00: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
ec10: 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d  onst(p, 1, 0);.}
ec20: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
ec30: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
ec40: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
ec50: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
ec60: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
ec70: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
ec80: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
ec90: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
eca0: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
ecb0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
ecc0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
ecd0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
ece0: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
ecf0: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
ed00: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
ed10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ed20: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
ed30: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
ed40: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
ed50: 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a  nst(p, 2, 0);.}.
ed60: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
ed70: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
ed80: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
ed90: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
eda0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
edb0: 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65  * for any single
edc0: 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c   row of the tabl
edd0: 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
ede0: 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ur.  In other wo
edf0: 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72  rds, the.** expr
ee00: 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20  ession must not 
ee10: 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e  refer to any non
ee20: 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66  -deterministic f
ee30: 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a  unction nor any.
ee40: 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74  ** table other t
ee50: 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74  han iCur..*/.int
ee60: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
ee70: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  bleConstant(Expr
ee80: 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a   *p, int iCur){.
ee90: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
eea0: 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29  onst(p, 3, iCur)
eeb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
eec0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
eed0: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
eee0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
eef0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
ef00: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
ef10: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
ef20: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
ef30: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
ef40: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
ef50: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
ef60: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
ef70: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
ef80: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
ef90: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
efa0: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
efb0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
efc0: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
efd0: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
efe0: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
eff0: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
f000: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f010: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
f020: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20  nction(Expr *p, 
f030: 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73  u8 isInit){.  as
f040: 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20  sert( isInit==0 
f050: 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a  || isInit==1 );.
f060: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
f070: 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74  onst(p, 4+isInit
f080: 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  , 0);.}..#ifdef 
f090: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
f0a0: 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a  RSOR_HINTS./*.**
f0b0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
f0c0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
f0d0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
f0e0: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
f0f0: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20  .** subquery of 
f100: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75  some kind.  Retu
f110: 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72  rn 0 if there ar
f120: 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e  e no subqueries.
f130: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f140: 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75  xprContainsSubqu
f150: 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ery(Expr *p){.  
f160: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
f170: 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
f180: 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20  (w));.  w.eCode 
f190: 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
f1a0: 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
f1b0: 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
f1c0: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
f1d0: 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73  k = selectNodeIs
f1e0: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69  Constant;.  sqli
f1f0: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
f200: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
f210: 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  Code==0;.}.#endi
f220: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
f230: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
f240: 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
f250: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
f260: 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
f270: 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
f280: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
f290: 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
f2a0: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
f2b0: 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
f2c0: 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
f2d0: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
f2e0: 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
f2f0: 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
f300: 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
f310: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
f320: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
f330: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
f340: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
f350: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
f360: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
f370: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
f380: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   rc = 0;.  if( p
f390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
f3a0: 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70   /* Can only hap
f3b0: 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  pen following on
f3c0: 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66   OOM */..  /* If
f3d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
f3e0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
f3f0: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
f400: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
f410: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
f420: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
f430: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
f440: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
f450: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
f460: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
f470: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
f480: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
f490: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
f4a0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
f4b0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
f4c0: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
f4d0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
f4e0: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
f4f0: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
f500: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
f510: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
f520: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
f530: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
f540: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f550: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
f560: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
f570: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f580: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f590: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
f5a0: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
f5b0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
f5c0: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
f5d0: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
f5e0: 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
f5f0: 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
f600: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
f610: 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
f620: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
f630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f640: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
f650: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
f660: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
f670: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
f680: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
f690: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
f6a0: 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
f6b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
f6c0: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
f6d0: 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
f6e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
f6f0: 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
f700: 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
f710: 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
f720: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
f730: 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
f740: 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
f750: 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
f760: 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
f770: 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
f780: 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
f790: 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
f7a0: 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
f7b0: 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
f7c0: 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
f7d0: 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
f7e0: 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
f7f0: 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
f800: 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
f810: 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
f820: 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
f830: 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
f840: 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
f850: 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
f860: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
f870: 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
f880: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
f890: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
f8a0: 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
f8b0: 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
f8c0: 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
f8d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f8e0: 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
f8f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
f900: 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
f910: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
f920: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
f930: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
f940: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
f950: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
f960: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
f970: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
f980: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
f990: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
f9a0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
f9b0: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
f9c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
f9d0: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
f9e0: 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
f9f0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73  COLUMN:.      as
fa00: 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30  sert( p->pTab!=0
fa10: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
fa20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
fa30: 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c  (p, EP_CanBeNull
fa40: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
fa50: 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30    (p->iColumn>=0
fa60: 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f   && p->pTab->aCo
fa70: 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  l[p->iColumn].no
fa80: 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64  tNull==0);.    d
fa90: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
faa0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
fab0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
fac0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
fad0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
fae0: 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
faf0: 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
fb00: 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
fb10: 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
fb20: 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
fb30: 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
fb40: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
fb50: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
fb60: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
fb70: 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
fb80: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
fb90: 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
fba0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
fbb0: 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
fbc0: 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
fbd0: 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
fbe0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
fbf0: 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
fc00: 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
fc10: 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
fc20: 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
fc30: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
fc40: 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
fc50: 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
fc60: 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
fc70: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
fc80: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
fc90: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
fca0: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
fcb0: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
fcc0: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
fcd0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
fce0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
fcf0: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
fd00: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
fd10: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
fd20: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
fd30: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
fd40: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
fd50: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
fd60: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
fd70: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
fd80: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
fd90: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
fda0: 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
fdb0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
fdc0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fdd0: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
fde0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
fdf0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
fe00: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
fe10: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
fe20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
fe30: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
fe40: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
fe50: 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
fe60: 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
fe70: 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
fe80: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
fe90: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
fea0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
feb0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
fec0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
fed0: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
fee0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
fef0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
ff00: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
ff10: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
ff20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
ff30: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
ff40: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
ff50: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
ff60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
ff70: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
ff80: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
ff90: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
ffa0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
ffb0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
ffc0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
ffd0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
ffe0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
fff0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
10000 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
10010 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
10020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73  ;.}../*.** pX is
10030 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49   the RHS of an I
10040 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
10050 70 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73  pX is a SELECT s
10060 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61  tatement .** tha
10070 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66  t can be simplif
10080 69 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20  ied to a direct 
10090 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68  table access, th
100a0 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  en return.** a p
100b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45  ointer to the SE
100c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
100d0 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20   If pX is not a 
100e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
100f0 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53  ,.** or if the S
10100 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10110 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69  needs to be mani
10120 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72  fested into a tr
10130 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65  ansient.** table
10140 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55  , then return NU
10150 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  LL..*/.#ifndef S
10160 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
10170 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63  ERY.static Selec
10180 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f  t *isCandidateFo
10190 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29  rInOpt(Expr *pX)
101a0 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20  {.  Select *p;. 
101b0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
101c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
101d0 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
101e0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
101f0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
10200 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
10210 65 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ect) ) return 0;
10220 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75    /* Not a subqu
10230 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70  ery */.  if( Exp
10240 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
10250 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20   EP_VarSelect)  
10260 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
10270 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20  Correlated subq 
10280 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70  */.  p = pX->x.p
10290 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d  Select;.  if( p-
102a0 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  >pPrior ) return
102b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
102c0 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75   /* Not a compou
102d0 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  nd SELECT */.  i
102e0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
102f0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
10300 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20  _Aggregate) ){. 
10310 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
10320 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
10330 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
10340 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
10350 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74  inct );.    test
10360 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
10370 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
10380 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
10390 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
103a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  ;.    return 0; 
103b0 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b  /* No DISTINCT k
103c0 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67  eyword and no ag
103d0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
103e0 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72  s */.  }.  asser
103f0 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
10400 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
10410 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55    /* Has no GROU
10420 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
10430 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
10440 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
10450 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
10460 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a  o LIMIT clause *
10470 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
10480 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
10490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
104a0 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20   LIMIT means no 
104b0 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20  OFFSET */.  if( 
104c0 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
104d0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
104e0 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
104f0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
10500 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
10510 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
10520 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   );.  if( pSrc->
10530 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
10540 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
10550 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46  Single term in F
10560 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
10570 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
10580 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
10590 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69  0;     /* FROM i
105a0 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  s not a subquery
105b0 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54   or view */.  pT
105c0 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
105d0 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
105e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
105f0 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
10600 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  ct==0 );        
10610 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
10620 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  se is not a view
10630 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
10640 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
10650 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
10660 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20  FROM clause not 
10670 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
10680 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
10690 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
106a0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
106b0 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20    /* All SELECT 
106c0 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20  results must be 
106d0 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f  columns. */.  fo
106e0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
106f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
10700 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70    Expr *pRes = p
10710 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
10720 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d  r;.    if( pRes-
10730 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
10740 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61   return 0;.    a
10750 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61  ssert( pRes->iTa
10760 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e  ble==pSrc->a[0].
10770 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e  iCursor );  /* N
10780 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  ot a correlated 
10790 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a  subquery */.  }.
107a0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65    return p;.}.#e
107b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
107c0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
107d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
107e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
107f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10800 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68  e that checks th
10810 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
10820 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c  mn of index tabl
10830 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66  e iCur to see if
10840 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  .** it contains 
10850 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  any NULL entries
10860 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67  .  Cause the reg
10870 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e  ister at regHasN
10880 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a  ull to be set.**
10890 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   to a non-NULL v
108a0 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e  alue if iCur con
108b0 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20  tains no NULLs. 
108c0 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20   Cause register 
108d0 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f  regHasNull.** to
108e0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
108f0 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
10900 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
10910 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  L values..*/.sta
10920 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
10930 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56  SetHasNullFlag(V
10940 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72  dbe *v, int iCur
10950 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c  , int regHasNull
10960 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  ){.  int addr1;.
10970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10980 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10990 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
109a0 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
109b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
109c0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
109d0 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
109e0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
109f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
10a00 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20  olumn, iCur, 0, 
10a10 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73  regHasNull);.  s
10a20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10a30 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
10a40 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43  EOFARG);.  VdbeC
10a50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73  omment((v, "firs
10a60 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c  t_entry_in(%d)",
10a70 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74   iCur));.  sqlit
10a80 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10a90 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64  , addr1);.}.#end
10aa0 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
10ab0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
10ac0 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  Y./*.** The argu
10ad0 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70  ment is an IN op
10ae0 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69  erator with a li
10af0 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
10b00 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72  ry) on the .** r
10b10 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20  ight-hand side. 
10b20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10b30 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e  that list is con
10b40 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  stant..*/.static
10b50 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68   int sqlite3InRh
10b60 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  sIsConstant(Expr
10b70 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a   *pIn){.  Expr *
10b80 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b  pLHS;.  int res;
10b90 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
10ba0 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c  HasProperty(pIn,
10bb0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
10bc0 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e  ;.  pLHS = pIn->
10bd0 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c  pLeft;.  pIn->pL
10be0 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d  eft = 0;.  res =
10bf0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
10c00 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70  nstant(pIn);.  p
10c10 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53  In->pLeft = pLHS
10c20 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
10c30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10c40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
10c50 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
10c60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10c70 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
10c80 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20  ator..** The pX 
10c90 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
10ca0 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74   expression on t
10cb0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
10cc0 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68   operator, which
10cd0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74  .** might be eit
10ce0 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78  her a list of ex
10cf0 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
10d00 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
10d10 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
10d20 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e  outine is to fin
10d30 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
10d40 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
10d50 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
10d60 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
10d70 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e  or membership in
10d80 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20   the RHS set or 
10d90 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
10da0 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72  gh.** all member
10db0 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74  s of the RHS set
10dc0 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
10dd0 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  cates..**.** A c
10de0 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
10df0 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  on the b-tree ob
10e00 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65  ject that is the
10e10 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
10e20 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70  perator.** and p
10e30 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74  X->iTable is set
10e40 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
10e50 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a   that cursor..**
10e60 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
10e70 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
10e80 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
10e90 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
10ea0 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
10eb0 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
10ec0 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65  ROWID      - The
10ed0 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
10ee0 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
10ef0 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
10f00 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
10f10 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
10f20 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61  s opened on an a
10f30 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
10f40 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
10f50 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63  DEX_DESC - The c
10f60 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
10f70 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
10f80 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
10f90 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20  INDEX_EPH       
10fa0 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
10fb0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
10fc0 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
10fd0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10ff0 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
11000 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  al table..**   I
11010 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20  N_INDEX_NOOP    
11020 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77     - No cursor w
11030 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54  as allocated.  T
11040 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  he IN operator m
11050 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ust be.**       
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73    implemented as
11080 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63   a sequence of c
11090 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a  omparisons..**.*
110a0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
110b0 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73  tree might be us
110c0 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78  ed if the RHS ex
110d0 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61  pression pX is a
110e0 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75   simple.** subqu
110f0 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a  ery such as:.**.
11100 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
11110 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e  olumn1>, <column
11120 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c  2>... FROM <tabl
11130 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
11140 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
11150 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
11160 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c   or a more compl
11170 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65  ex subquery, the
11180 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61  n.** an ephemera
11190 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65  l table might ne
111a0 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ed to be generat
111b0 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20  ed from the RHS 
111c0 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e  and then.** pX->
111d0 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70  iTable made to p
111e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65  oint to the ephe
111f0 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
11200 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
11210 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a  sting table..**.
11220 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70  ** The inFlags p
11230 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f  arameter must co
11240 6e 74 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e  ntain exactly on
11250 65 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a  e of the bits.**
11260 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
11270 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58  SHIP or IN_INDEX
11280 5f 4c 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61  _LOOP.  If inFla
11290 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49  gs contains.** I
112a0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
112b0 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e  IP, then the gen
112c0 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c  erated table wil
112d0 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a  l be used for a.
112e0 2a 2a 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68  ** fast membersh
112f0 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74  ip test.  When t
11300 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  he IN_INDEX_LOOP
11310 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
11320 0a 2a 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c  .** IN index wil
11330 6c 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f  l be used to loo
11340 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  p over all value
11350 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20  s of the RHS of 
11360 74 68 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74  the.** IN operat
11370 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  or..**.** When I
11380 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20  N_INDEX_LOOP is 
11390 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
113a0 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
113b0 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
113c0 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
113d0 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68  members) then th
113e0 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f  e b-tree must no
113f0 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63  t contain duplic
11400 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65  ates..** An ephe
11410 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
11420 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
11430 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c  the selected col
11440 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74  umns are guarant
11450 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69  eed.** to be uni
11460 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63  que - either bec
11470 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e  ause it is an IN
11480 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
11490 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61  Y or due to.** a
114a0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
114b0 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  nt or index..**.
114c0 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58  ** When IN_INDEX
114d0 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75  _MEMBERSHIP is u
114e0 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
114f0 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
11500 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65   .** for fast se
11510 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
11520 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65  ts) then an ephe
11530 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
11540 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c   .** be used unl
11550 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73  ess <columns> is
11560 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45   a single INTEGE
11570 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
11580 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69  lumn or an .** i
11590 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e  ndex can be foun
115a0 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
115b0 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61  fied <columns> a
115c0 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e  s its left-most.
115d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e  .**.** If the IN
115e0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61  _INDEX_NOOP_OK a
115f0 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  nd IN_INDEX_MEMB
11600 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20  ERSHIP are both 
11610 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  set and.** if th
11620 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
11630 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
11640 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
11650 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ry) then this.**
11660 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64   routine might d
11670 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74  ecide that creat
11680 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
11690 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62   b-tree for memb
116a0 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e  ership.** testin
116b0 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69  g is too expensi
116c0 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e  ve and return IN
116d0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e  _INDEX_NOOP.  In
116e0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a   that case, the.
116f0 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
11700 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d  ne should implem
11710 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ent the IN opera
11720 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75  tor using a sequ
11730 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72  ence.** of Eq or
11740 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   Ne comparison o
11750 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
11760 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   When the b-tree
11770 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
11780 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
11790 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  sts, the calling
117a0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67   function.** mig
117b0 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ht need to know 
117c0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
117d0 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74  he RHS side of t
117e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
117f0 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  * contains a NUL
11800 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e  L.  If prRhsHasN
11810 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c  ull is not a NUL
11820 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a  L pointer and .*
11830 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  * if there is an
11840 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  y chance that th
11850 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f  e (...) might co
11860 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c  ntain a NULL val
11870 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ue at.** runtime
11880 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65  , then a registe
11890 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
118a0 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
118b0 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a  number written.*
118c0 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75  * to *prRhsHasNu
118d0 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ll. If there is 
118e0 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
118f0 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
11900 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
11910 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61  e, then *prRhsHa
11920 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e  sNull is left un
11930 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
11940 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
11950 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
11960 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
11970 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  d in *prRhsHasNu
11980 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ll, then.** the 
11990 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65  value in that re
119a0 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e  gister will be N
119b0 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65  ULL if the b-tre
119c0 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  e contains one o
119d0 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76  r more.** NULL v
119e0 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69  alues, and it wi
119f0 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e  ll be some non-N
11a00 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65  ULL value if the
11a10 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
11a20 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75   no.** NULL valu
11a30 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
11a40 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72   aiMap parameter
11a50 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
11a60 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
11a70 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69  n array containi
11a80 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e  ng.** one elemen
11a90 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  t for each colum
11aa0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
11ab0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
11ac0 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a  nt on the RHS.**
11ad0 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20   of the IN(...) 
11ae0 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27  operator. The i'
11af0 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
11b00 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74  array is populat
11b10 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f  ed with the.** o
11b20 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64  ffset of the ind
11b30 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ex column that m
11b40 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68 20  atches the i'th 
11b50 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
11b60 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  by the.** SELECT
11b70 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
11b80 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11b90 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e   and selected in
11ba0 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  dex are:.**.**  
11bb0 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c   (?,?,?) IN (SEL
11bc0 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  ECT a, b, c FROM
11bd0 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45   t1).**   CREATE
11be0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
11bf0 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20  b, c, a);.**.** 
11c00 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20  then aiMap[] is 
11c10 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b  populated with {
11c20 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66  2, 0, 1}..*/.#if
11c30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11c40 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
11c50 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
11c60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11c70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
11c80 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
11c90 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c  t */.  Expr *pX,
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68    /* The right-h
11cc0 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 6f  and side (RHS) o
11cd0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
11ce0 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61  r */.  u32 inFla
11cf0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
11d00 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f    /* IN_INDEX_LO
11d10 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c  OP, _MEMBERSHIP,
11d20 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b   and/or _NOOP_OK
11d30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68 73   */.  int *prRhs
11d40 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20  HasNull,        
11d50 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
11d60 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75 73  ding NULL status
11d70 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a  .  See notes */.
11d80 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20 20    int *aiMap    
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11da0 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64  Mapping from Ind
11db0 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48 53  ex fields to RHS
11dc0 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20   fields */.){.  
11dd0 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  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 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
11e00 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
11e10 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
11e20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e40 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
11e50 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
11e60 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
11e70 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
11e80 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
11e90 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
11ea0 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
11eb0 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
11ec0 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
11ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11ee0 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
11ef0 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
11f00 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
11f10 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
11f20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
11f30 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
11f40 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
11f50 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
11f60 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d    mustBeUnique =
11f70 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
11f80 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a  NDEX_LOOP)!=0;..
11f90 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20    /* If the RHS 
11fa0 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20  of this IN(...) 
11fb0 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45  operator is a SE
11fc0 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20  LECT, and if it 
11fd0 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68  matters .  ** wh
11fe0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
11ff0 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63   SELECT result c
12000 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
12010 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68  ues, check wheth
12020 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e  er.  ** or not N
12030 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ULL is actually 
12040 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79  possible (it may
12050 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61   not be, for exa
12060 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20  mple, due .  ** 
12070 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  to NOT NULL cons
12080 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73  traints in the s
12090 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55  chema). If no NU
120a0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  LL values are po
120b0 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74  ssible,.  ** set
120c0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f   prRhsHasNull to
120d0 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e   0 before contin
120e0 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20  uing.  */.  if( 
120f0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20  prRhsHasNull && 
12100 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pX->flags & EP_
12110 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
12120 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70    int i;.    Exp
12130 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
12140 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pX->x.pSelect->p
12150 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
12160 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
12170 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
12180 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12190 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74  CanBeNull(pEList
121a0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20  ->a[i].pExpr) ) 
121b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
121c0 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e   if( i==pEList->
121d0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
121e0 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
121f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12200 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12210 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
12220 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  le or index can 
12230 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
12240 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72  satisfy the quer
12250 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66  y.  This is pref
12260 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61  erable to genera
12270 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a  ting a new .  **
12280 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
12290 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
122a0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28  se->nErr==0 && (
122b0 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46  p = isCandidateF
122c0 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20  orInOpt(pX))!=0 
122d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
122e0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12300 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
12310 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c  tion */.    Tabl
12320 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62     /* Table <tab
12350 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20  le>. */.    i16 
12360 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
12390 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  dx for pTab */. 
123a0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
123b0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
123c0 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
123d0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
123e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
123f0 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20  pEList!=0 );    
12400 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
12410 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
12420 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
12430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12440 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
12450 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61  pr!=0 ); /* Beca
12460 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
12470 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
12480 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12490 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20  pSrc!=0 );      
124a0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
124b0 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
124c0 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
124d0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70  .    pTab = p->p
124e0 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
124f0 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
12500 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61  OP_Transaction a
12510 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20  nd OP_TableLock 
12520 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  for <table>. */.
12530 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
12540 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
12550 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
12560 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
12570 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
12580 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
12590 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
125a0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
125b0 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
125c0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
125d0 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20   assert(v);  /* 
125e0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
125f0 20 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e   has always been
12600 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
12610 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45  ed */.    if( nE
12620 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
12630 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
12640 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
12650 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53   /* The "x IN (S
12660 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
12670 20 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f   table)" case */
12680 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
12690 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
126a0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
126b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
126c0 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
126d0 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
126e0 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
126f0 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
12700 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54  nRead);.      eT
12710 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
12720 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c  OWID;..      sql
12730 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
12740 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
12750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
12760 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
12790 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
127a0 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  int affinity_ok 
127b0 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
127c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
127d0 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  k that the affin
127e0 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ity that will be
127f0 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
12800 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20   each .      ** 
12810 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68  comparison is th
12820 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66  e same as the af
12830 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63  finity of each c
12840 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20  olumn in table. 
12850 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52       ** on the R
12860 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
12870 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f  rator.  If it no
12880 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
12890 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  sible to.      *
128a0 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20  * use any index 
128b0 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
128c0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
128d0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
128e0 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b  affinity_ok; i++
128f0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
12900 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56  *pLhs = sqlite3V
12910 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
12920 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  r(pX->pLeft, i);
12930 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
12940 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  l = pEList->a[i]
12950 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  .pExpr->iColumn;
12960 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64  .        char id
12970 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61  xaff = sqlite3Ta
12980 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
12990 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a  y(pTab,iCol); /*
129a0 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
129b0 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61 66        char cmpaf
129c0 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
129d0 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c  reAffinity(pLhs,
129e0 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20   idxaff);.      
129f0 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61    testcase( cmpa
12a00 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
12a10 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74  LOB );.        t
12a20 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d  estcase( cmpaff=
12a30 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
12a40 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74   );.        swit
12a50 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20  ch( cmpaff ){.  
12a60 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
12a70 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20  ITE_AFF_BLOB:.  
12a80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12a90 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
12aa0 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
12ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
12ac0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
12ad0 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65  finity() only re
12ae0 74 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e  turns TEXT if on
12af0 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
12b00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68            ** oth
12b10 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69  er has no affini
12b20 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ty and the other
12b30 20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20 20   side is TEXT.  
12b40 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20  Hence,.         
12b50 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77     ** the only w
12b60 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f  ay for cmpaff to
12b70 20 62 65 20 54 45 58 54 20 69 73 20 66 6f 72 20   be TEXT is for 
12b80 69 64 78 61 66 66 20 74 6f 20 62 65 20 54 45 58  idxaff to be TEX
12b90 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  T.            **
12ba0 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72   and for the ter
12bb0 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  m on the LHS of 
12bc0 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e  the IN to have n
12bd0 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  o affinity. */. 
12be0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
12bf0 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54  t( idxaff==SQLIT
12c00 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
12c10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12c20 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75  .          defau
12c30 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt:.            
12c40 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71  affinity_ok = sq
12c50 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
12c60 66 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a  finity(idxaff);.
12c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12c80 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66 66  }..      if( aff
12c90 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20  inity_ok ){.    
12ca0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
12cb0 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  r an existing in
12cc0 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f  dex that will wo
12cd0 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f  rk for this IN o
12ce0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
12cf0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
12d00 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
12d10 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78  & eType==0; pIdx
12d20 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
12d30 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b           Bitmask
12d40 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f   colUsed;      /
12d50 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * Columns of the
12d60 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20   index used */. 
12d70 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b           Bitmask
12d80 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f   mCol;         /
12d90 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63  * Mask for the c
12da0 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f  urrent column */
12db0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12dc0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78  Idx->nColumn<nEx
12dd0 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pr ) continue;. 
12de0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
12df0 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42  mum nColumn is B
12e00 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c  MS-2, not BMS-1,
12e10 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
12e20 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20  compute.        
12e30 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78    ** BITMASK(nEx
12e40 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72  pr) without over
12e50 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20  flowing */.     
12e60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
12e70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d  Idx->nColumn==BM
12e80 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  S-2 );.         
12e90 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
12ea0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20  >nColumn==BMS-1 
12eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
12ec0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
12ed0 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65  BMS-1 ) continue
12ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12ef0 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a  mustBeUnique ){.
12f00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12f10 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
12f20 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  xpr.            
12f30 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   ||(pIdx->nColum
12f40 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e  n>nExpr && !IsUn
12f50 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29  iqueIndex(pIdx))
12f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
12f80 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73  ntinue;  /* This
12f90 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e   index is not un
12fa0 69 71 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e  ique over the IN
12fb0 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   RHS columns */.
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
12fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
12fe0 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d         colUsed =
12ff0 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73   0;   /* Columns
13000 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20 73   of index used s
13010 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
13020 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
13030 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13040 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68         Expr *pLh
13050 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  s = sqlite3Vecto
13060 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58  rFieldSubexpr(pX
13070 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
13080 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
13090 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Rhs = pEList->a[
130a0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
130b0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
130c0 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
130d0 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
130e0 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20  q(pParse, pLhs, 
130f0 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20  pRhs);.         
13100 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20     int j;.  .   
13110 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13120 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73   pReq!=0 || pRhs
13130 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f  ->iColumn==XN_RO
13140 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  WID || pParse->n
13150 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Err );.         
13160 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
13170 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
13180 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
13190 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d  x->aiColumn[j]!=
131a0 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  pRhs->iColumn ) 
131b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
131c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
131d0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
131e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
131f0 20 69 66 28 20 70 52 65 71 21 3d 30 20 26 26 20   if( pReq!=0 && 
13200 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
13210 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  Req->zName, pIdx
13220 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
13230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13240 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
13250 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13260 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
13270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
13280 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
13290 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b  j==nExpr ) break
132a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43  ;.            mC
132b0 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b  ol = MASKBIT(j);
132c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
132d0 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20   mCol & colUsed 
132e0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68  ) break; /* Each
132f0 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c   column used onl
13300 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20  y once */.      
13310 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d        colUsed |=
13320 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   mCol;.         
13330 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61     if( aiMap ) a
13340 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  iMap[i] = j;.   
13350 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
13360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
13370 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65  =nExpr || colUse
13380 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70  d!=(MASKBIT(nExp
13390 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  r)-1) );.       
133a0 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d     if( colUsed==
133b0 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d  (MASKBIT(nExpr)-
133c0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
133d0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
133e0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
133f0 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65  t means the inde
13400 78 20 70 49 64 78 20 69 73 20 75 73 61 62 6c 65  x pIdx is usable
13410 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
13420 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
13430 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
13440 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
13450 6f 76 65 72 61 67 65 28 76 29 3b 0a 23 69 66 6e  overage(v);.#ifn
13460 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13470 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 20 20 20  EXPLAIN.        
13480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13490 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
134a0 61 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  ain, 0, 0, 0,.  
134b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
134c0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
134d0 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46  USING INDEX %s F
134e0 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c  OR IN-OPERATOR",
134f0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20  pIdx->zName),.  
13500 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 44              P4_D
13510 59 4e 41 4d 49 43 29 3b 0a 23 65 6e 64 69 66 0a  YNAMIC);.#endif.
13520 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13530 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13540 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
13550 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
13560 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iDb);.          
13570 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
13580 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
13590 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
135a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
135b0 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
135c0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
135d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 4e        assert( IN
135e0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
135f0 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  C == IN_INDEX_IN
13600 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20  DEX_ASC+1 );.   
13610 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d           eType =
13620 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
13630 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72  ASC + pIdx->aSor
13640 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20  tOrder[0];.  .  
13650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
13660 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69  RhsHasNull ){.#i
13670 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
13680 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
13690 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ASK.            
136a0 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c    i64 mask = (1<
136b0 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20  <nExpr)-1;.     
136c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
136d0 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
136e0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
136f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13700 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c       iTab, 0, 0,
13710 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f   (u8*)&mask, P4_
13720 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20  INT64);.#endif. 
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72               *pr
13740 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70  RhsHasNull = ++p
13750 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
13760 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
13770 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Expr==1 ){.     
13780 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13790 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
137a0 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73  (v, iTab, *prRhs
137b0 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  HasNull);.      
137c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
137d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
137e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
137f0 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
13800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
13810 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20         } /* End 
13820 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65  loop over indexe
13830 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20  s */.      } /* 
13840 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74 79  End if( affinity
13850 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f  _ok ) */.    } /
13860 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20  * End if not an 
13870 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20  rowid index */. 
13880 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70   } /* End attemp
13890 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73  t to optimize us
138a0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a  ing an index */.
138b0 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65  .  /* If no pree
138c0 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73  xisting index is
138d0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
138e0 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a  he IN clause.  *
138f0 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e  * and IN_INDEX_N
13900 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65  OOP is an allowe
13910 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64  d reply.  ** and
13920 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
13930 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
13940 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62   list, not a sub
13950 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74  query.  ** and t
13960 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f  he RHS is not co
13970 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77  nstant or has tw
13980 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73  o or fewer terms
13990 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  ,.  ** then it i
139a0 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61  s not worth crea
139b0 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
139c0 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75  l table to evalu
139d0 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20  ate.  ** the IN 
139e0 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75  operator so retu
139f0 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
13a00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
13a10 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46  pe==0.   && (inF
13a20 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
13a30 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21  NOOP_OK).   && !
13a40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13a50 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
13a60 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65  ).   && (!sqlite
13a70 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
13a80 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c  (pX) || pX->x.pL
13a90 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20  ist->nExpr<=2). 
13aa0 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   ){.    eType = 
13ab0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20  IN_INDEX_NOOP;. 
13ac0 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
13ad0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
13ae0 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65  ld not find an e
13af0 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
13b00 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73   index to use as
13b10 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e   the RHS b-tree.
13b20 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  .    ** We will 
13b30 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65  have to generate
13b40 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
13b50 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f  ble to do the jo
13b60 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33  b..    */.    u3
13b70 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  2 savedNQueryLoo
13b80 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
13b90 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
13ba0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
13bb0 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
13bc0 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
13bd0 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e  if( inFlags & IN
13be0 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20  _INDEX_LOOP ){. 
13bf0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
13c00 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  eryLoop = 0;.   
13c10 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74     if( pX->pLeft
13c20 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ->iColumn<0 && !
13c30 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13c40 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
13c50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  ) ){.        eTy
13c60 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
13c70 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
13c80 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73   }else if( prRhs
13c90 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  HasNull ){.     
13ca0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
13cb0 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
13cc0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13cd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13ce0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
13cf0 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
13d00 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
13d10 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
13d20 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
13d30 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
13d40 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
13d50 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
13d60 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a  le = iTab;.  }..
13d70 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65    if( aiMap && e
13d80 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
13d90 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70  NDEX_ASC && eTyp
13da0 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
13db0 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e  X_DESC ){.    in
13dc0 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
13dd0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
13de0 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29  rSize(pX->pLeft)
13df0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
13e00 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69  <n; i++) aiMap[i
13e10 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  ] = i;.  }.  ret
13e20 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
13e30 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
13e40 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
13e50 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Y./*.** Argument
13e60 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c   pExpr is an (?,
13e70 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65   ?...) IN(...) e
13e80 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
13e90 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
13ea0 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
13eb0 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ns a nul-termina
13ec0 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
13ed0 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66  ining .** the af
13ee0 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75  finities to be u
13ef0 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  sed for each col
13f00 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  umn of the compa
13f10 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  rison..**.** It 
13f20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
13f30 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
13f40 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ler to ensure th
13f50 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  at the returned.
13f60 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65  ** string is eve
13f70 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
13f80 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
13f90 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
13fa0 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e  har *exprINAffin
13fb0 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
13fc0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
13fd0 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
13fe0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
13ff0 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
14000 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
14010 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65  e(pLeft);.  Sele
14020 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70  ct *pSelect = (p
14030 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
14040 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45  _xIsSelect) ? pE
14050 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a  xpr->x.pSelect :
14060 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74   0;.  char *zRet
14070 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ;..  assert( pEx
14080 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
14090 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  .  zRet = sqlite
140a0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61  3DbMallocRaw(pPa
140b0 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29  rse->db, nVal+1)
140c0 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
140d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
140e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
140f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
14100 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65   *pA = sqlite3Ve
14110 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
14120 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
14130 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74    char a = sqlit
14140 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
14150 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  A);.      if( pS
14160 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
14170 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74   zRet[i] = sqlit
14180 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
14190 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  y(pSelect->pELis
141a0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61  t->a[i].pExpr, a
141b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
141c0 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
141d0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
141e0 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c   }.    zRet[nVal
141f0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
14200 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
14210 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
14220 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
14230 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  ERY./*.** Load t
14240 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
14250 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
14260 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rst argument wit
14270 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d  h an error .** m
14280 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
14290 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
142a0 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
142b0 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
142c0 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f  cted M".*/   .vo
142d0 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c  id sqlite3Subsel
142e0 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a  ectError(Parse *
142f0 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74  pParse, int nAct
14300 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74  ual, int nExpect
14310 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
14320 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c  *zFmt = "sub-sel
14330 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63  ect returns %d c
14340 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
14350 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33  d %d";.  sqlite3
14360 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14370 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20   zFmt, nActual, 
14380 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64  nExpect);.}.#end
14390 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73  if../*.** Expres
143a0 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
143b0 76 65 63 74 6f 72 20 74 68 61 74 20 68 61 73 20  vector that has 
143c0 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63  been used in a c
143d0 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20  ontext where.** 
143e0 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  it is not permit
143f0 74 65 64 2e 20 49 66 20 70 45 78 70 72 20 69 73  ted. If pExpr is
14400 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65   a sub-select ve
14410 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ctor, this routi
14420 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65  ne .** loads the
14430 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69   Parse object wi
14440 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20  th a message of 
14450 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
14460 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65    "sub-select re
14470 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20  turns N columns 
14480 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a  - expected 1".**
14490 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73  .** Or, if it is
144a0 20 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61   a regular scala
144b0 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20  r vector:.**.** 
144c0 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73    "row value mis
144d0 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64  used".*/   .void
144e0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
144f0 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50  rorMsg(Parse *pP
14500 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
14510 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r){.#ifndef SQLI
14520 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14530 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
14540 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
14550 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
14560 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
14570 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
14580 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
14590 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d  ->nExpr, 1);.  }
145a0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
145b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
145c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
145d0 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
145e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
145f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
14600 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
14610 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
14620 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
14630 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20  , EXISTS,.** or 
14640 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
14650 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
14660 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
14670 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
14680 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
14690 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
146a0 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
146b0 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
146c0 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
146d0 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
146e0 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
146f0 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
14700 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
14710 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
14720 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
14730 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
14740 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
14750 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
14760 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
14770 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
14780 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
14790 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
147a0 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
147b0 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
147c0 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52  If parameter isR
147d0 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  owid is non-zero
147e0 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  , then expressio
147f0 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61  n pExpr is guara
14800 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f  nteed.** to be o
14810 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77  f the form "<row
14820 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29  id> IN (?, ?, ?)
14830 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e  ", where <rowid>
14840 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
14850 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67  ** to some integ
14860 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66  er key column of
14870 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e   a table B-Tree.
14880 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75   In this case, u
14890 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20  se an.** intkey 
148a0 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20  B-Tree to store 
148b0 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e  the set of IN(..
148c0 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61  .) values instea
148d0 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
148e0 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61  * (slower) varia
148f0 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20  ble length keys 
14900 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  B-Tree..**.** If
14910 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73   rMayHaveNull is
14920 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20   non-zero, that 
14930 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f  means that the o
14940 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49  peration is an I
14950 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45  N.** (not a SELE
14960 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e  CT or EXISTS) an
14970 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d  d that the RHS m
14980 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  ight contains NU
14990 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73  LLs..** All this
149a0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
149b0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
149c0 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62  register given b
149d0 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a  y rMayHaveNull.*
149e0 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  * to NULL.  Call
149f0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
14a00 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63  l take care of c
14a10 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67  hanging this reg
14a20 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74  ister.** value t
14a30 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
14a40 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
14a50 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ee..**.** For a 
14a60 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
14a70 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72   operator, retur
14a80 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  n the register t
14a90 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  hat holds the.**
14aa0 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61 20   result.  For a 
14ab0 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c  multi-column SEL
14ac0 45 43 54 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ECT, the result 
14ad0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63  is stored in a c
14ae0 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72  ontiguous.** arr
14af0 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
14b00 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 76  and the return v
14b10 61 6c 75 65 20 69 73 20 74 68 65 20 72 65 67 69  alue is the regi
14b20 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74  ster of the left
14b30 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20  -most.** result 
14b40 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72 6e 20  column.  Return 
14b50 30 20 66 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f  0 for IN operato
14b60 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  rs or if an erro
14b70 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66  r occurs..*/.#if
14b80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14b90 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
14ba0 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
14bb0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
14bc0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
14bd0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14be0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
14bf0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
14c00 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c   The IN, SELECT,
14c10 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
14c20 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61  tor */.  int rHa
14c30 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20  sNullFlag,      
14c40 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
14c50 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
14c60 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e  r NULLs exist in
14c70 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73   RHS */.  int is
14c80 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
14c90 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48    /* If true, LH
14ca0 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  S of IN operator
14cb0 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29   is a rowid */.)
14cc0 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e  {.  int jmpIfDyn
14cd0 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20 20  amic = -1;      
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74  /* One-time test
14d00 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e   address */.  in
14d10 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20  t rReg = 0;     
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
14d40 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74  r storing result
14d50 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ing */.  Vdbe *v
14d60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14d70 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
14d80 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
14d90 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
14da0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
14db0 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54  pParse);..  /* T
14dc0 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  he evaluation of
14dd0 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53 2f 53   the IN/EXISTS/S
14de0 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72 65  ELECT must be re
14df0 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69 6d  peated every tim
14e00 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63  e it.  ** is enc
14e10 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20  ountered if any 
14e20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14e30 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
14e40 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
14e50 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
14e60 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
14e70 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
14e80 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
14e90 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
14ea0 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
14eb0 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
14ec0 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
14ed0 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
14ee0 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
14ef0 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
14f00 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
14f10 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
14f20 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
14f30 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
14f40 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
14f50 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
14f60 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
14f70 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
14f80 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
14f90 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14fa0 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
14fb0 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69  .    jmpIfDynami
14fc0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  c = sqlite3VdbeA
14fd0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
14fe0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
14ff0 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  v);.  }..#ifndef
15000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
15010 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73  LAIN.  if( pPars
15020 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
15030 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
15040 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
15050 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58  (pParse->db, "EX
15060 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51 55  ECUTE %s%s SUBQU
15070 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20  ERY %d",.       
15080 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
15090 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20  ?"":"CORRELATED 
150a0 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ",.        pExpr
150b0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53  ->op==TK_IN?"LIS
150c0 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20 20  T":"SCALAR",.   
150d0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 4e 65       pParse->iNe
150e0 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29  xtSelectId.    )
150f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15100 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
15110 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
15120 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
15130 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
15140 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
15150 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
15160 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
15170 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
15180 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
15190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
151a0 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
151b0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
151c0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
151d0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
151e0 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
151f0 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
15200 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
15210 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
15220 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
15230 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
15240 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61  */.      int nVa
15250 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
15260 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
15270 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a  vector pLeft */.
15280 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61        .      nVa
15290 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  l = sqlite3ExprV
152a0 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
152b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
152c0 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c  !isRowid || nVal
152d0 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==1 );..      /*
152e0 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
152f0 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
15300 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
15310 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
15320 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
15330 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
15340 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20   the same way.  
15350 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  An ephemeral tab
15360 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
15370 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65  filled with inde
15380 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
15390 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
153a0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
153b0 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65  ** SELECT or the
153c0 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20   <exprlist>..   
153d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
153e0 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73  f the 'x' expres
153f0 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
15400 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53   value, or the S
15410 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a  ELECT....      *
15420 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  * statement retu
15430 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c  rns a column val
15440 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  ue, then the aff
15450 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20  inity of that.  
15460 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73      ** column is
15470 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74   used to build t
15480 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  he index keys. I
15490 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74  f both 'x' and t
154a0 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  he.      ** SELE
154b0 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
154c0 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
154d0 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
154e0 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20  ty is used.     
154f0 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f   ** if either co
15500 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
15510 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
15520 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
15530 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f  .      ** 'x' no
15540 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
15550 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
15560 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
15570 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ric affinity.   
15580 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20     ** is used.. 
15590 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
155a0 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
155b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
155c0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
155d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
155e0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
155f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  , .          pEx
15600 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52  pr->iTable, (isR
15610 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20  owid?0:nVal));. 
15620 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
15630 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71  isRowid ? 0 : sq
15640 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
15650 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56  c(pParse->db, nV
15660 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69  al, 1);..      i
15670 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
15680 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
15690 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
156a0 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
156b0 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
156c0 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
156d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
156e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
156f0 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
15700 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
15710 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
15720 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
15730 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
15740 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
15750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15760 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
15770 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
15780 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ect;.        Exp
15790 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
157a0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
157b0 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
157c0 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
157d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
157e0 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74  LHS and RHS of t
157f0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64  he IN operator d
15800 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61  o not match, tha
15810 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  t.        ** err
15820 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  or will have bee
15830 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65  n caught long be
15840 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68  fore we reach th
15850 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
15860 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
15870 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
15880 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
15890 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
158a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  t;.          int
158b0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   i;.          sq
158c0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
158d0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
158e0 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
158f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  e);.          de
15900 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78  st.zAffSdst = ex
15910 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
15920 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
15930 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e         pSelect->
15940 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
15950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15960 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
15970 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
15980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
15990 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
159a0 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
159b0 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
159c0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
159d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
159e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
159f0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
15a00 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
15a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
15a20 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
15a30 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
15a40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15a50 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
15a60 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
15a70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
15a80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
15aa0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
15ab0 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
15ac0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15ad0 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
15ae0 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
15af0 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
15b00 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
15b10 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
15b20 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
15b30 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15b40 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
15b50 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
15b60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
15b70 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
15b80 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
15b90 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
15ba0 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
15bc0 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
15bd0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
15be0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
15bf0 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
15c00 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
15c10 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
15c20 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20  CollSeq(.       
15c30 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
15c40 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p, pEList->a[i]
15c50 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 20  .pExpr.         
15c60 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
15c70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
15c80 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
15c90 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
15ca0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
15cb0 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
15cc0 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
15cd0 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
15ce0 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
15cf0 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
15d00 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
15d10 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
15d20 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
15d30 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
15d40 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
15d50 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
15d60 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
15d70 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
15d80 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
15d90 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
15da0 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
15db0 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
15dc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
15dd0 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
15de0 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
15df0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
15e00 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
15e10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
15e20 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
15e30 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
15e40 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
15e50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
15e60 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
15e70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
15e80 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
15e90 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
15ea0 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
15eb0 33 3b 0a 0a 20 20 20 20 20 20 20 20 61 66 66 69  3;..        affi
15ec0 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
15ed0 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74  prAffinity(pLeft
15ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
15ef0 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
15f00 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
15f10 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
15f20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15f30 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
15f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
15f50 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
15f60 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
15f70 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
15f80 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
15f90 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
15fa0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
15fb0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15fc0 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eft);.        }.
15fd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
15fe0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
15ff0 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
16000 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
16010 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
16020 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
16030 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
16040 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16050 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16060 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
16070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16080 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
16090 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66  , r2);.        f
160a0 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
160b0 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
160c0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
160d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
160e0 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
160f0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
16100 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49       int iValToI
16110 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ns;..          /
16120 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
16130 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
16140 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
16150 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
16160 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
16170 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
16180 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
16190 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
161a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
161b0 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
161c0 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
161d0 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
161e0 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
161f0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
16200 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
16210 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
16220 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
16230 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
16240 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20  jmpIfDynamic>=0 
16250 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
16260 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
16270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
16280 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
16290 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79  oNoop(v, jmpIfDy
162a0 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20  namic);.        
162b0 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
162c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
162d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
162e0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
162f0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
16300 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
16310 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
16320 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
16330 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78  wid && sqlite3Ex
16340 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c  prIsInteger(pE2,
16350 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a   &iValToIns) ){.
16360 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16370 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16380 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70   OP_InsertInt, p
16390 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
163a0 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20  , iValToIns);.  
163b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
163c0 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20             r3 = 
163d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
163e0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
163f0 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
16400 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
16410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16430 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
16440 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  nt, 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 73 71 6c 69 74 65 33 56          sqlite3V
16470 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
16480 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+2);.          
16490 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
164a0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
164b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
164c0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
164d0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
164e0 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20  , r2, r3);.     
164f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16500 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16510 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16520 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
16530 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r3, 1, r2, &affi
16540 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
16550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16560 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16570 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
16580 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
16590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
165a0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
165b0 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
165c0 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33  ->iTable, r2, r3
165d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
165e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
165f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16600 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16610 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16620 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
16630 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16640 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
16650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16660 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
16670 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16680 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
16690 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49  r, (void *)pKeyI
166a0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
166b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
166c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
166d0 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
166e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
166f0 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c  LECT:.    defaul
16700 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  t: {.      /* Ca
16710 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54  se 3:    (SELECT
16720 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20   ... FROM ...). 
16730 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20       **     or: 
16740 20 20 20 45 58 49 53 54 53 28 53 45 4c 45 43 54     EXISTS(SELECT
16750 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20   ... FROM ...). 
16760 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16770 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67   For a SELECT, g
16780 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
16790 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66  put the values f
167a0 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
167b0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
167c0 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e  irst row into an
167d0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
167e0 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ers and return t
167f0 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20  he index of.    
16800 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
16810 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a  egister..      *
16820 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
16830 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
16840 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65   write an intege
16850 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
16860 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20   or 1 (exists). 
16870 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72       ** into a r
16880 65 67 69 73 74 65 72 20 61 6e 64 20 72 65 74 75  egister and retu
16890 72 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  rn that register
168a0 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a   number..      *
168b0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f  *.      ** In bo
168c0 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75  th cases, the qu
168d0 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64  ery is augmented
168e0 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e   with "LIMIT 1".
168f0 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20    Any .      ** 
16900 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69  preexisting limi
16910 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69  t is discarded i
16920 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e  n place of the n
16930 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20  ew LIMIT 1..    
16940 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63    */.      Selec
16950 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
16980 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a  ment to encode *
16990 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  /.      SelectDe
169a0 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20  st dest;        
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169c0 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
169d0 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  h SELECT result 
169e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65  */.      int nRe
169f0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a10 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61  * Registers to a
16a20 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20  llocate */..    
16a30 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
16a40 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
16a50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16a60 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
16a70 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
16a80 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
16a90 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
16aa0 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
16ab0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
16ac0 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
16ad0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16ae0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
16af0 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
16b00 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
16b10 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78        nReg = pEx
16b20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
16b30 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  T ? pSel->pEList
16b40 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20  ->nExpr : 1;.   
16b50 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
16b60 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
16b70 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  0, pParse->nMem+
16b80 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
16b90 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
16ba0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
16bb0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
16bc0 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
16bd0 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a  Dest = SRT_Mem;.
16be0 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53 64          dest.iSd
16bf0 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  st = dest.iSDPar
16c00 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  m;.        dest.
16c10 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20  nSdst = nReg;.  
16c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16c30 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
16c40 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
16c50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72  arm, dest.iSDPar
16c60 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20  m+nReg-1);.     
16c70 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16c80 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
16c90 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
16ca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16cb0 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
16cc0 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
16cd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ce0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
16cf0 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  er, 0, dest.iSDP
16d00 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
16d10 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
16d20 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
16d30 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
16d40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
16d50 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
16d60 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  , pSel->pLimit);
16d70 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
16d80 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
16d90 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
16da0 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 0a 20  b, TK_INTEGER,. 
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
16de0 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ns[1], 0);.     
16df0 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20   pSel->iLimit = 
16e00 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 73  0;.      pSel->s
16e10 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d  elFlags &= ~SF_M
16e20 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 20  ultiValue;.     
16e30 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
16e40 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
16e50 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
16e60 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
16e70 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20     }.      rReg 
16e80 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
16e90 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
16ea0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
16eb0 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
16ec0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16ed0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73  .  }..  if( rHas
16ee0 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20  NullFlag ){.    
16ef0 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
16f00 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e  lFlag(v, pExpr->
16f10 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c  iTable, rHasNull
16f20 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Flag);.  }..  if
16f30 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d  ( jmpIfDynamic>=
16f40 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
16f50 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16f60 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20  jmpIfDynamic);. 
16f70 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
16f80 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
16f90 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67  ;..  return rReg
16fa0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
16fb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16fc0 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
16fd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16fe0 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70  ERY./*.** Expr p
16ff0 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29  In is an IN(...)
17000 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69   expression. Thi
17010 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
17020 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73  s that the .** s
17030 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65  ub-select on the
17040 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29   RHS of the IN()
17050 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74 68   operator has th
17060 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
17070 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20   .** columns as 
17080 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68  the vector on th
17090 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68  e LHS. Or, if th
170a0 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28  e RHS of the IN(
170b0 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73  ) is not .** a s
170c0 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74  ub-query, that t
170d0 68 65 20 4c 48 53 20 69 73 20 61 20 76 65 63 74  he LHS is a vect
170e0 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f  or of size 1..*/
170f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
17100 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70  CheckIN(Parse *p
17110 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e  Parse, Expr *pIn
17120 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72  ){.  int nVector
17130 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
17140 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c  ctorSize(pIn->pL
17150 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  eft);.  if( (pIn
17160 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
17170 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
17180 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d  f( nVector!=pIn-
17190 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
171a0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
171b0 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
171c0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
171d0 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d   pIn->x.pSelect-
171e0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
171f0 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20  nVector);.      
17200 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
17210 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63    }else if( nVec
17220 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 73 71  tor!=1 ){.    sq
17230 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
17240 4d 73 67 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  Msg(pParse, pIn-
17250 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74  >pLeft);.    ret
17260 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
17270 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
17280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17290 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
172a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
172b0 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72  e for an IN expr
172c0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
172d0 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
172e0 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49  ...).**      x I
172f0 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
17300 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20   ...).**.** The 
17310 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28  left-hand side (
17320 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72  LHS) is a scalar
17330 20 6f 72 20 76 65 63 74 6f 72 20 65 78 70 72 65   or vector expre
17340 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20  ssion.  The .** 
17350 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
17360 28 52 48 53 29 20 69 73 20 61 6e 20 61 72 72 61  (RHS) is an arra
17370 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  y of zero or mor
17380 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65 73 2c  e scalar values,
17390 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75 65 72   or a.** subquer
173a0 79 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  y.  If the RHS i
173b0 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68  s a subquery, th
173c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
173d0 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a  lt columns must.
173e0 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ** match the num
173f0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
17400 6e 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20  n the vector on 
17410 74 68 65 20 4c 48 53 2e 20 20 49 66 20 74 68 65  the LHS.  If the
17420 20 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73   RHS is.** a lis
17430 74 20 6f 66 20 76 61 6c 75 65 73 2c 20 74 68 65  t of values, the
17440 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   LHS must be a s
17450 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  calar. .**.** Th
17460 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
17470 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
17480 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 74 61 69   value is contai
17490 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
174a0 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  HS..** The resul
174b0 74 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  t is false if th
174c0 65 20 4c 48 53 20 69 73 20 64 65 66 69 6e 69 74  e LHS is definit
174d0 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  ely not in the R
174e0 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 73  HS.  The .** res
174f0 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  ult is NULL if t
17500 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 74  he presence of t
17510 68 65 20 4c 48 53 20 69 6e 20 74 68 65 20 52 48  he LHS in the RH
17520 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20  S cannot be .** 
17530 64 65 74 65 72 6d 69 6e 65 64 20 64 75 65 20 74  determined due t
17540 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54  o NULLs..**.** T
17550 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
17560 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
17570 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46  jumps to destIfF
17580 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20  alse if the LHS 
17590 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61  is not .** conta
175a0 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
175b0 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20  RHS.  If due to 
175c0 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20  NULLs we cannot 
175d0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
175e0 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61   LHS.** is conta
175f0 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
17600 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73  then jump to des
17610 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65  tIfNull.  If the
17620 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65   LHS is containe
17630 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
17640 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  RHS then fall th
17650 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  rough..**.** See
17660 20 74 68 65 20 73 65 70 61 72 61 74 65 20 69 6e   the separate in
17670 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63  -operator.md doc
17680 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20  umentation file 
17690 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  in the canonical
176a0 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75 72 63  .** SQLite sourc
176b0 65 20 74 72 65 65 20 66 6f 72 20 61 64 64 69 74  e tree for addit
176c0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
176d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
176e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
176f0 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eIN(.  Parse *pP
17700 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
17710 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
17720 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
17730 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
17740 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f  Expr,          /
17750 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73  * The IN express
17760 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
17770 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f  tIfFalse,      /
17780 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c  * Jump here if L
17790 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
177a0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a  ned in the RHS *
177b0 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75  /.  int destIfNu
177c0 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ll        /* Jum
177d0 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65  p here if the re
177e0 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77  sults are unknow
177f0 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a  n due to NULLs *
17800 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48  /.){.  int rRhsH
17810 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20  asNull = 0;  /* 
17820 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73  Register that is
17830 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e   true if RHS con
17840 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65  tains NULL value
17850 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  s */.  int eType
17860 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17870 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20  Type of the RHS 
17880 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20 20  */.  int rLhs;  
17890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
178a0 67 69 73 74 65 72 28 73 29 20 68 6f 6c 64 69 6e  gister(s) holdin
178b0 67 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 73  g the LHS values
178c0 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72   */.  int rLhsOr
178d0 69 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ig;         /* L
178e0 48 53 20 76 61 6c 75 65 73 20 70 72 69 6f 72 20  HS values prior 
178f0 74 6f 20 72 65 6f 72 64 65 72 69 6e 67 20 62 79  to reordering by
17900 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64   aiMap[] */.  Vd
17910 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
17920 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
17930 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
17940 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  ion */.  int *ai
17950 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Map = 0;       /
17960 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f  * Map from vecto
17970 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78  r field to index
17980 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
17990 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20  r *zAff = 0;    
179a0 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
179b0 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72  tring for compar
179c0 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  isons */.  int n
179d0 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Vector;         
179e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
179f0 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 20  ors for this IN 
17a00 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
17a10 74 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20  t iDummy;       
17a20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72      /* Dummy par
17a30 61 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f  ameter to exprCo
17a40 64 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20  deVector() */.  
17a50 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
17a60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53        /* The LHS
17a70 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
17a80 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  tor */.  int i; 
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17aa0 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * loop counter *
17ab0 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70  /.  int destStep
17ac0 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  2;        /* Whe
17ad0 72 65 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20  re to jump when 
17ae0 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73 74  NULLs seen in st
17af0 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ep 2 */.  int de
17b00 73 74 53 74 65 70 36 20 3d 20 30 3b 20 20 20 20  stStep6 = 0;    
17b10 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65  /* Start of code
17b20 20 66 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a 20   for Step 6 */. 
17b30 20 69 6e 74 20 61 64 64 72 54 72 75 74 68 4f 70   int addrTruthOp
17b40 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
17b50 73 20 6f 66 20 6f 70 63 6f 64 65 20 74 68 61 74  s of opcode that
17b60 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
17b70 49 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  IN is true */.  
17b80 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b  int destNotNull;
17b90 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
17ba0 72 65 20 69 66 20 61 20 63 6f 6d 70 61 72 69 73  re if a comparis
17bb0 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75 65 20 69  on is not true i
17bc0 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e  n step 6 */.  in
17bd0 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
17be0 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
17bf0 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f  e step-6 loop */
17c00 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78   ..  pLeft = pEx
17c10 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28  pr->pLeft;.  if(
17c20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
17c30 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  kIN(pParse, pExp
17c40 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  r) ) return;.  z
17c50 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69  Aff = exprINAffi
17c60 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
17c70 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d  pr);.  nVector =
17c80 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
17c90 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c  orSize(pExpr->pL
17ca0 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20  eft);.  aiMap = 
17cb0 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d  (int*)sqlite3DbM
17cc0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20  allocZero(.     
17cd0 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65   pParse->db, nVe
17ce0 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74  ctor*(sizeof(int
17cf0 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 29  ) + sizeof(char)
17d00 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66 28  ) + 1.  );.  if(
17d10 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
17d20 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
17d30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17d40 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20  IN_oom_error;.. 
17d50 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63   /* Attempt to c
17d60 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20  ompute the RHS. 
17d70 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c  After this step,
17d80 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   if anything oth
17d90 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f  er than.  ** IN_
17da0 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65  INDEX_NOOP is re
17db0 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c  turned, the tabl
17dc0 65 20 6f 70 65 6e 65 64 20 69 74 68 20 63 75 72  e opened ith cur
17dd0 73 6f 72 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  sor pExpr->iTabl
17de0 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  e .  ** contains
17df0 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
17e00 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53   make up the RHS
17e10 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  . If IN_INDEX_NO
17e20 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  OP is returned,.
17e30 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73    ** the RHS has
17e40 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
17e50 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70  ded.  */.  v = p
17e60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17e70 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
17e80 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74        /* OOM det
17e90 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74  ected prior to t
17ea0 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
17eb0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
17ec0 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65  ((v, "begin IN e
17ed0 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20  xpr"));.  eType 
17ee0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
17ef0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78  ndex(pParse, pEx
17f00 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
17f30 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f  SHIP | IN_INDEX_
17f40 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20  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 64 65 73 74 49 66 46 61 6c 73        destIfFals
17f70 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20  e==destIfNull ? 
17f80 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c  0 : &rRhsHasNull
17f90 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73  , aiMap);..  ass
17fa0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
17fb0 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20  r || nVector==1 
17fc0 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
17fd0 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c  EX_EPH.       ||
17fe0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
17ff0 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54  _INDEX_ASC || eT
18000 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
18010 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23  DEX_DESC .  );.#
18020 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
18030 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20  UG.  /* Confirm 
18040 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e  that aiMap[] con
18050 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e  tains nVector in
18060 74 65 67 65 72 20 76 61 6c 75 65 73 20 62 65 74  teger values bet
18070 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20  ween 0 and.  ** 
18080 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20  nVector-1. */.  
18090 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
180a0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  or; i++){.    in
180b0 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f  t j, cnt;.    fo
180c0 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65  r(cnt=j=0; j<nVe
180d0 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61  ctor; j++) if( a
180e0 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74  iMap[j]==i ) cnt
180f0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
18100 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65  cnt==1 );.  }.#e
18110 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  ndif..  /* Code 
18120 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
18130 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
18140 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74   IN (...)". If t
18150 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a  he LHS is a .  *
18160 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69  * vector, then i
18170 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
18180 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74  n array of nVect
18190 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61  or registers sta
181a0 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72  rting .  ** at r
181b0 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c  1..  **.  ** sql
181c0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
181d0 29 20 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f  ) might have reo
181e0 72 64 65 72 65 64 20 74 68 65 20 66 69 65 6c 64  rdered the field
181f0 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63  s of the LHS vec
18200 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  tor.  ** so that
18210 20 74 68 65 20 66 69 65 6c 64 73 20 61 72 65 20   the fields are 
18220 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
18230 72 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67  r as an existing
18240 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20   index.   The.  
18250 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79  ** aiMap[] array
18260 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70   contains a mapp
18270 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69  ing from the ori
18280 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20  ginal LHS field 
18290 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68  order to.  ** th
182a0 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68  e field order th
182b0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 52  at matches the R
182c0 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  HS index..  */. 
182d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
182e0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
182f0 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72   rLhsOrig = expr
18300 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
18310 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d  e, pLeft, &iDumm
18320 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  y);.  for(i=0; i
18330 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61  <nVector && aiMa
18340 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20  p[i]==i; i++){} 
18350 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64  /* Are LHS field
18360 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a  s reordered? */.
18370 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72    if( i==nVector
18380 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66   ){.    /* LHS f
18390 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65  ields are not re
183a0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72  ordered */.    r
183b0 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a  Lhs = rLhsOrig;.
183c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
183d0 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20  Need to reorder 
183e0 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61  the LHS fields a
183f0 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61  ccording to aiMa
18400 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20  p */.    rLhs = 
18410 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
18420 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63  nge(pParse, nVec
18430 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tor);.    for(i=
18440 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
18450 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
18460 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18470 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67  P_Copy, rLhsOrig
18480 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69  +i, rLhs+aiMap[i
18490 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], 0);.    }.  }
184a0 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65  ..  /* If sqlite
184b0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64  3FindInIndex() d
184c0 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63  id not find or c
184d0 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74  reate an index t
184e0 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74  hat is.  ** suit
184f0 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74  able for evaluat
18500 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ing the IN opera
18510 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  tor, then evalua
18520 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20  te using a.  ** 
18530 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
18540 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  arisons..  **.  
18550 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65 70 20  ** This is step 
18560 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70  (1) in the in-op
18570 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69  erator.md optimi
18580 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20  zed algorithm.. 
18590 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
185a0 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29  =IN_INDEX_NOOP )
185b0 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
185c0 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
185d0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c  .pList;.    Coll
185e0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
185f0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
18600 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18610 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c  Left);.    int l
18620 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33  abelOk = sqlite3
18630 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18640 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65  ;.    int r2, re
18650 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74  gToFree;.    int
18660 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a   regCkNull = 0;.
18670 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
18680 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
18690 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
186a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
186b0 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e  .    if( destIfN
186c0 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
186d0 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e   ){.      regCkN
186e0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ull = sqlite3Get
186f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
18700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18710 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
18720 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68  itAnd, rLhs, rLh
18730 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  s, regCkNull);. 
18740 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
18750 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  0; ii<pList->nEx
18760 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
18770 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
18780 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
18790 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  , pList->a[ii].p
187a0 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65  Expr, &regToFree
187b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67  );.      if( reg
187c0 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65  CkNull && sqlite
187d0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
187e0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
187f0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
18800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18810 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65  v, OP_BitAnd, re
18820 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67  gCkNull, r2, reg
18830 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  CkNull);.      }
18840 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c  .      if( ii<pL
18850 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20  ist->nExpr-1 || 
18860 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
18870 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
18880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18890 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
188a0 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32  Lhs, labelOk, r2
188b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
188c0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
188d0 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
188e0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
188f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
18900 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
18910 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
18920 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
18930 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
18940 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
18950 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
18960 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20  v, zAff[0]);.   
18970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18980 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66    assert( destIf
18990 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
189a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
189b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
189c0 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64  , OP_Ne, rLhs, d
189d0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a  estIfFalse, r2,.
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189f0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
18a00 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
18a10 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  EQ); VdbeCoverag
18a20 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
18a30 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
18a40 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53  5(v, zAff[0] | S
18a50 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
18a60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18a70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18a80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
18a90 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
18aa0 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
18ab0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
18ac0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18ad0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
18ae0 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
18af0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
18b00 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
18b10 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
18b20 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
18b30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
18b40 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18b50 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73   labelOk);.    s
18b60 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18b70 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
18b80 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74  CkNull);.    got
18b90 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
18ba0 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
18bb0 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20  }..  /* Step 2: 
18bc0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
18bd0 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73  the LHS contains
18be0 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   any NULL column
18bf0 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  s.  If the.  ** 
18c00 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e  LHS does contain
18c10 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20   NULLs then the 
18c20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65  result must be e
18c30 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e  ither FALSE or N
18c40 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c  ULL..  ** We wil
18c50 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  l then skip the 
18c60 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66  binary search of
18c70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
18c80 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d   if( destIfNull=
18c90 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
18ca0 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20      destStep2 = 
18cb0 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d  destIfFalse;.  }
18cc0 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74  else{.    destSt
18cd0 65 70 32 20 3d 20 64 65 73 74 53 74 65 70 36 20  ep2 = destStep6 
18ce0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18cf0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20  eLabel(v);.  }. 
18d00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
18d10 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  tor; i++){.    E
18d20 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
18d30 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
18d40 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
18d50 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c   i);.    if( sql
18d60 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
18d70 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  l(p) ){.      sq
18d80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18d90 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c  v, OP_IsNull, rL
18da0 68 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29  hs+i, destStep2)
18db0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
18dc0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
18dd0 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e   }..  /* Step 3.
18de0 20 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77    The LHS is now
18df0 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e   known to be non
18e00 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62  -NULL.  Do the b
18e10 69 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a  inary search.  *
18e20 2a 20 6f 66 20 74 68 65 20 52 48 53 20 75 73 69  * of the RHS usi
18e30 6e 67 20 74 68 65 20 4c 48 53 20 61 73 20 61 20  ng the LHS as a 
18e40 70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64  probe.  If found
18e50 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a  , the result is.
18e60 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a    ** true..  */.
18e70 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
18e80 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
18e90 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
18ea0 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74  se, the RHS is t
18eb0 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c  he ROWID of tabl
18ec0 65 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20  e b-tree and so 
18ed0 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b  we also.    ** k
18ee0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 52 48 53  now that the RHS
18ef0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48   is non-NULL.  H
18f00 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65  ence, we combine
18f10 20 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20   steps 3 and 4. 
18f20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e     ** into a sin
18f30 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  gle opcode. */. 
18f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18f50 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
18f60 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  owid, pExpr->iTa
18f70 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
18f80 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62  , rLhs);.    Vdb
18f90 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18fa0 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20    addrTruthOp = 
18fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18fc0 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20  0(v, OP_Goto);  
18fd0 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a  /* Return True *
18fe0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
18ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19000 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
19010 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20   rLhs, nVector, 
19020 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72  0, zAff, nVector
19030 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49  );.    if( destI
19040 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
19050 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  ll ){.      /* C
19060 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e  ombine Step 3 an
19070 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20  d Step 5 into a 
19080 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f  single opcode */
19090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
190a0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
190b0 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_NotFound, pExp
190c0 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
190d0 66 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20  fFalse,.        
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190f0 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72     rLhs, nVector
19100 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19110 76 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  v);.      goto s
19120 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
19130 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
19140 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79  .    /* Ordinary
19150 20 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65   Step 3, for the
19160 20 63 61 73 65 20 77 68 65 72 65 20 46 41 4c 53   case where FALS
19170 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64  E and NULL are d
19180 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61  istinct */.    a
19190 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c  ddrTruthOp = sql
191a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
191b0 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
191c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
191d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
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 72 4c 68 73 2c 20 6e 56 65         rLhs, nVe
19200 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72  ctor); VdbeCover
19210 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
19220 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68  * Step 4.  If th
19230 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74  e RHS is known t
19240 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e  o be non-NULL an
19250 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e  d we did not fin
19260 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20  d.  ** an match 
19270 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62  on the search ab
19280 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
19290 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c  sult must be FAL
192a0 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  SE..  */.  if( r
192b0 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56  RhsHasNull && nV
192c0 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20  ector==1 ){.    
192d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
192e0 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
192f0 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65   rRhsHasNull, de
19300 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
19310 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19320 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
19330 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
19340 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
19350 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
19360 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a  en NULL and.  **
19370 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73   FALSE, then jus
19380 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  t return false. 
19390 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
193a0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
193b0 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ull ) sqlite3Vdb
193c0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
193d0 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65  alse);..  /* Ste
193e0 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  p 6: Loop throug
193f0 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48  h rows of the RH
19400 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68  S.  Compare each
19410 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e   row to the LHS.
19420 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d  .  ** If any com
19430 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c  parison is NULL,
19440 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
19450 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c   is NULL.  If al
19460 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  l.  ** compariso
19470 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65  ns are FALSE the
19480 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75  n the final resu
19490 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a  lt is FALSE..  *
194a0 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61  *.  ** For a sca
194b0 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73  lar LHS, it is s
194c0 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65  ufficient to che
194d0 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ck just the firs
194e0 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68  t row.  ** of th
194f0 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66  e RHS..  */.  if
19500 28 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71  ( destStep6 ) sq
19510 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
19520 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65  Label(v, destSte
19530 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d  p6);.  addrTop =
19540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19550 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
19560 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19570 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
19580 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19590 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31  .  if( nVector>1
195a0 20 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e   ){.    destNotN
195b0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
195c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
195d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
195e0 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63  or nVector==1, c
195f0 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61  ombine steps 6 a
19600 6e 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74  nd 7 by immediat
19610 65 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20  ely returning.  
19620 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68    ** FALSE if th
19630 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73  e first comparis
19640 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a  on is not NULL *
19650 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c  /.    destNotNul
19660 6c 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b  l = destIfFalse;
19670 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
19680 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
19690 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
196a0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
196b0 3b 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73  ;.    int r3 = s
196c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
196d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20  (pParse);.    p 
196e0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
196f0 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
19700 74 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  t, i);.    pColl
19710 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19720 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
19730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19740 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
19750 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
19760 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20  ble, i, r3);.   
19770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19780 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68  p4(v, OP_Ne, rLh
19790 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  s+i, destNotNull
197a0 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
197b0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
197c0 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
197d0 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43  LSEQ);.    VdbeC
197e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
197f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19800 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33  mpReg(pParse, r3
19810 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19820 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19830 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
19840 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65  Null);.  if( nVe
19850 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71  ctor>1 ){.    sq
19860 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
19870 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74  Label(v, destNot
19880 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
19890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
198a0 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e  OP_Next, pExpr->
198b0 69 54 61 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b  iTable, addrTop+
198c0 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
198d0 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  rage(v);..    /*
198e0 20 53 74 65 70 20 37 3a 20 20 49 66 20 77 65 20   Step 7:  If we 
198f0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
19900 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  , we know that t
19910 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20  he result must. 
19920 20 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20     ** be false. 
19930 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
19940 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
19950 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
19960 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lse);.  }..  /* 
19970 4a 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72  Jumps here in or
19980 64 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72  der to return tr
19990 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ue. */.  sqlite3
199a0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
199b0 61 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73  addrTruthOp);..s
199c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
199d0 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
199e0 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20   rLhs!=rLhsOrig 
199f0 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  ) sqlite3Release
19a00 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19a10 72 4c 68 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  rLhs);.  sqlite3
19a20 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
19a30 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  rse);.  VdbeComm
19a40 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
19a50 65 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33  expr"));.sqlite3
19a60 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65  ExprCodeIN_oom_e
19a70 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
19a80 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
19a90 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69  , aiMap);.  sqli
19aa0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
19ab0 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23  ->db, zAff);.}.#
19ac0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19ad0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
19ae0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19af0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
19b00 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  OINT./*.** Gener
19b10 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
19b20 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
19b30 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f   the floating po
19b40 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73  int.** value des
19b50 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e  cribed by z[0..n
19b60 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
19b70 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
19b80 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
19b90 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
19ba0 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
19bb0 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
19bc0 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
19bd0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
19be0 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
19bf0 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
19c00 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
19c10 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
19c20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
19c30 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
19c40 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
19c50 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61  har *z, int nega
19c60 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
19c70 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
19c80 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75  z!=0) ){.    dou
19c90 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73  ble value;.    s
19ca0 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76  qlite3AtoF(z, &v
19cb0 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72  alue, sqlite3Str
19cc0 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45  len30(z), SQLITE
19cd0 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65  _UTF8);.    asse
19ce0 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61  rt( !sqlite3IsNa
19cf0 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54  N(value) ); /* T
19d00 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65  he new AtoF neve
19d10 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f  r returns NaN */
19d20 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46  .    if( negateF
19d30 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
19d40 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
19d50 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
19d60 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
19d70 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
19d80 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20  lue, P4_REAL);. 
19d90 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
19da0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
19db0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
19dc0 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
19dd0 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
19de0 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
19df0 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
19e00 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78  r iMem..**.** Ex
19e10 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61  pr.u.zToken is a
19e20 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a  lways UTF8 and z
19e30 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a  ero-terminated..
19e40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
19e50 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65  odeInteger(Parse
19e60 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
19e70 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c  pExpr, int negFl
19e80 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
19e90 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19ea0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
19eb0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
19ec0 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
19ed0 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d    int i = pExpr-
19ee0 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61  >u.iValue;.    a
19ef0 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20  ssert( i>=0 );. 
19f00 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
19f10 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c   i = -i;.    sql
19f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19f30 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
19f40 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b   iMem);.  }else{
19f50 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20  .    int c;.    
19f60 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  i64 value;.    c
19f70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
19f80 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
19f90 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
19fa0 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69   );.    c = sqli
19fb0 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
19fc0 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
19fd0 20 69 66 28 20 63 3d 3d 31 20 7c 7c 20 28 63 3d   if( c==1 || (c=
19fe0 3d 32 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20  =2 && !negFlag) 
19ff0 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76  || (negFlag && v
1a000 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49  alue==SMALLEST_I
1a010 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53  NT64)){.#ifdef S
1a020 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1a030 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1a040 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a050 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a  pParse, "oversiz
1a060 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73  ed integer: %s%s
1a070 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22  ", negFlag ? "-"
1a080 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65   : "", z);.#else
1a090 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a0a0 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52  OMIT_HEX_INTEGER
1a0b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1a0c0 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30  e3_strnicmp(z,"0
1a0d0 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",2)==0 ){.    
1a0e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a0f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78  Msg(pParse, "hex
1a100 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67   literal too big
1a110 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1a120 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20  ?"-":"",z);.    
1a130 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1a140 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
1a150 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65  odeReal(v, z, ne
1a160 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  gFlag, iMem);.  
1a170 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1a180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
1a190 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c  ( negFlag ){ val
1a1a0 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c  ue = c==2 ? SMAL
1a1b0 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61  LEST_INT64 : -va
1a1c0 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  lue; }.      sql
1a1d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
1a1e0 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p8(v, OP_Int64, 
1a1f0 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
1a200 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36  )&value, P4_INT6
1a210 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  4);.    }.  }.}.
1a220 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 63 6f 6c  ./*.** Erase col
1a230 75 6d 6e 2d 63 61 63 68 65 20 65 6e 74 72 79 20  umn-cache entry 
1a240 6e 75 6d 62 65 72 20 69 0a 2a 2f 0a 73 74 61 74  number i.*/.stat
1a250 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74  ic void cacheEnt
1a260 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  ryClear(Parse *p
1a270 50 61 72 73 65 2c 20 69 6e 74 20 69 29 7b 0a 20  Parse, int i){. 
1a280 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
1a290 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65  lCache[i].tempRe
1a2a0 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  g ){.    if( pPa
1a2b0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
1a2c0 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
1a2d0 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
1a2e0 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
1a2f0 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
1a300 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65  pReg++] = pParse
1a310 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1a320 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Reg;.    }.  }. 
1a330 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
1a340 68 65 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 70 50  he--;.  if( i<pP
1a350 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20  arse->nColCache 
1a360 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61  ){.    pParse->a
1a370 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50  ColCache[i] = pP
1a380 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1a390 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1a3a0 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  e];.  }.}.../*.*
1a3b0 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
1a3c0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61  column cache tha
1a3d0 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63  t a particular c
1a3e0 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20  olumn from a.** 
1a3f0 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
1a400 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
1a410 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73  particular regis
1a420 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
1a430 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1a440 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
1a450 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20  , int iTab, int 
1a460 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b  iCol, int iReg){
1a470 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1a480 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64  minLru;.  int id
1a490 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79  xLru;.  struct y
1a4a0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
1a4b0 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72  /* Unless an err
1a4c0 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
1a4d0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1a4e0 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73  s are always pos
1a4f0 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65  itive. */.  asse
1a500 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50  rt( iReg>0 || pP
1a510 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
1a520 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1a530 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65  Failed );.  asse
1a540 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20  rt( iCol>=-1 && 
1a550 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f  iCol<32768 );  /
1a560 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20  * Finite column 
1a570 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a  numbers */..  /*
1a580 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75   The SQLITE_Colu
1a590 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73  mnCache flag dis
1a5a0 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ables the column
1a5b0 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73   cache.  This is
1a5c0 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74   used.  ** for t
1a5d0 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  esting only - to
1a5e0 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c   verify that SQL
1a5f0 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20  ite always gets 
1a600 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
1a610 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69    ** with and wi
1a620 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e  thout the column
1a630 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
1a640 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1a650 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  isabled(pParse->
1a660 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  db, SQLITE_Colum
1a670 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e  nCache) ) return
1a680 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
1a690 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
1a6a0 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
1a6b0 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
1a6c0 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
1a6d0 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
1a6e0 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
1a6f0 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
1a700 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
1a710 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
1a720 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
1a730 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
1a740 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
1a750 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
1a760 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1a770 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70  ->aColCache; i<p
1a780 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1a790 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1a7a0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
1a7b0 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
1a7c0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
1a7d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a7e0 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69 73   If the cache is
1a7f0 20 61 6c 72 65 61 64 79 20 66 75 6c 6c 2c 20 64   already full, d
1a800 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73 74 20  elete the least 
1a810 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 65 6e  recently used en
1a820 74 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  try */.  if( pPa
1a830 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3e 3d  rse->nColCache>=
1a840 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
1a850 45 20 29 7b 0a 20 20 20 20 6d 69 6e 4c 72 75 20  E ){.    minLru 
1a860 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
1a870 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20    idxLru = -1;. 
1a880 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
1a890 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1a8a0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1a8b0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1a8c0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 72  .      if( p->lr
1a8d0 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20  u<minLru ){.    
1a8e0 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
1a8f0 20 20 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d          minLru =
1a900 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 20 20 7d   p->lru;.      }
1a910 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26  .    }.    p = &
1a920 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1a930 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 7d 65 6c  e[idxLru];.  }el
1a940 73 65 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61  se{.    p = &pPa
1a950 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70  rse->aColCache[p
1a960 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1a970 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ++];.  }..  /* A
1a980 64 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  dd the new entry
1a990 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1a9a0 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 70 2d  he cache */.  p-
1a9b0 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
1a9c0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
1a9d0 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
1a9e0 62 3b 0a 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  b;.  p->iColumn 
1a9f0 3d 20 69 43 6f 6c 3b 0a 20 20 70 2d 3e 69 52 65  = iCol;.  p->iRe
1aa00 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 2d 3e 74  g = iReg;.  p->t
1aa10 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 2d  empReg = 0;.  p-
1aa20 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
1aa30 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f  CacheCnt++;.}../
1aa40 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
1aa50 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74  at registers bet
1aa60 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b  ween iReg..iReg+
1aa70 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67  nReg-1 are being
1aa80 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a   overwritten..**
1aa90 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65   Purge the range
1aaa0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72   of registers fr
1aab0 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
1aac0 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  che..*/.void sql
1aad0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1aae0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
1aaf0 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
1ab00 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 20   nReg){.  int i 
1ab10 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c  = 0;.  while( i<
1ab20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1ab30 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
1ab40 79 43 6f 6c 43 61 63 68 65 20 2a 70 20 3d 20 26  yColCache *p = &
1ab50 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1ab60 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  e[i];.    if( p-
1ab70 3e 69 52 65 67 20 3e 3d 20 69 52 65 67 20 26 26  >iReg >= iReg &&
1ab80 20 70 2d 3e 69 52 65 67 20 3c 20 69 52 65 67 2b   p->iReg < iReg+
1ab90 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61  nReg ){.      ca
1aba0 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
1abb0 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65  arse, i);.    }e
1abc0 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  lse{.      i++;.
1abd0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1abe0 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
1abf0 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63  current column c
1ac00 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41  ache context.  A
1ac10 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61  ny new entries a
1ac20 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f  dded.** added to
1ac30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1ac40 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c  e after this cal
1ac50 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68  l are removed wh
1ac60 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  en the.** corres
1ac70 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75  ponding pop occu
1ac80 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
1ac90 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1aca0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1acb0 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
1acc0 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66  eLevel++;.#ifdef
1acd0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ace0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
1acf0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
1ad00 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
1ad10 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53  .    printf("PUS
1ad20 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72  H to %d\n", pPar
1ad30 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
1ad40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
1ad50 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f  /*.** Remove fro
1ad60 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
1ad70 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74  he any entries t
1ad80 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73  hat were added s
1ad90 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20  ince the.** the 
1ada0 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33  previous sqlite3
1adb0 45 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70  ExprCachePush op
1adc0 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  eration.  In oth
1add0 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72  er words, restor
1ade0 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74  e.** the cache t
1adf0 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  o the state it w
1ae00 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20  as in prior the 
1ae10 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68  most recent Push
1ae20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ae30 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61  3ExprCachePop(Pa
1ae40 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1ae50 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 61 73 73  int i = 0;.  ass
1ae60 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61  ert( pParse->iCa
1ae70 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20  cheLevel>=1 );. 
1ae80 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1ae90 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53  evel--;.#ifdef S
1aea0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1aeb0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
1aec0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1aed0 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
1aee0 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20     printf("POP  
1aef0 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65  to %d\n", pParse
1af00 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a  ->iCacheLevel);.
1af10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69    }.#endif.  whi
1af20 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  le( i<pParse->nC
1af30 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 69  olCache ){.    i
1af40 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  f( pParse->aColC
1af50 61 63 68 65 5b 69 5d 2e 69 4c 65 76 65 6c 3e 70  ache[i].iLevel>p
1af60 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1af70 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  el ){.      cach
1af80 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
1af90 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73  se, i);.    }els
1afa0 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  e{.      i++;.  
1afb0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1afc0 20 57 68 65 6e 20 61 20 63 61 63 68 65 64 20 63   When a cached c
1afd0 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c  olumn is reused,
1afe0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1aff0 69 74 73 20 72 65 67 69 73 74 65 72 20 69 73 0a  its register is.
1b000 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61  ** no longer ava
1b010 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70  ilable as a temp
1b020 20 72 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b   register.  tick
1b030 65 74 20 23 33 38 37 39 3a 20 20 74 68 61 74 20  et #3879:  that 
1b040 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72  same.** register
1b050 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68 65   might be in the
1b060 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70   cache in multip
1b070 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65  le places, so be
1b080 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20   sure to.** get 
1b090 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  them all..*/.sta
1b0a0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1b0b0 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
1b0c0 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  ster(Parse *pPar
1b0d0 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
1b0e0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1b0f0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1b100 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1b110 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1b120 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1b130 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  he; i++, p++){. 
1b140 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
1b150 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d  iReg ){.      p-
1b160 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
1b170 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65    }.  }.}../* Ge
1b180 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1b190 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20   will load into 
1b1a0 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20  register regOut 
1b1b0 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a  a value that is.
1b1c0 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
1b1d0 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74  or the iIdxCol-t
1b1e0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  h column of inde
1b1f0 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20  x pIdx..*/.void 
1b200 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
1b210 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a  oadIndexColumn(.
1b220 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1b230 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1b240 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
1b250 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a  dex *pIdx,    /*
1b260 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
1b270 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65   column is to be
1b280 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1b290 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
1b2a0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1b2b0 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a  to a table row *
1b2c0 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c  /.  int iIdxCol,
1b2d0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
1b2e0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  n of the index t
1b2f0 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1b300 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1b310 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e   /* Store the in
1b320 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  dex column value
1b330 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1b340 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54  r */.){.  i16 iT
1b350 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69  abCol = pIdx->ai
1b360 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b  Column[iIdxCol];
1b370 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d  .  if( iTabCol==
1b380 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61  XN_EXPR ){.    a
1b390 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f  ssert( pIdx->aCo
1b3a0 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73  lExpr );.    ass
1b3b0 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
1b3c0 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43  xpr->nExpr>iIdxC
1b3d0 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ol );.    pParse
1b3e0 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61  ->iSelfTab = iTa
1b3f0 62 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  bCur;.    sqlite
1b400 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50  3ExprCodeCopy(pP
1b410 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c  arse, pIdx->aCol
1b420 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d  Expr->a[iIdxCol]
1b430 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b  .pExpr, regOut);
1b440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1b450 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1b460 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50  ColumnOfTable(pP
1b470 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64  arse->pVdbe, pId
1b480 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43  x->pTable, iTabC
1b490 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
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 69 54 61 62 43 6f 6c 2c          iTabCol,
1b4c0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
1b4d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b4e0 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20  code to extract 
1b4f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1b500 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
1b510 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  of a table..*/.v
1b520 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1b530 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1b540 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ble(.  Vdbe *v, 
1b550 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1b560 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
1b570 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  ction */.  Table
1b580 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68   *pTab,    /* Th
1b590 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
1b5a0 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a  ng the value */.
1b5b0 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
1b5c0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1b5d0 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50  ursor.  Or the P
1b5e0 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54  K cursor for WIT
1b5f0 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20  HOUT ROWID */.  
1b600 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
1b610 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1b620 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63  column to extrac
1b630 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  t */.  int regOu
1b640 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63  t      /* Extrac
1b650 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  t the value into
1b660 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1b670 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c  /.){.  if( iCol<
1b680 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  0 || iCol==pTab-
1b690 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  >iPKey ){.    sq
1b6a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b6b0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1b6c0 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCur, regOut);. 
1b6d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1b6e0 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
1b6f0 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
1b700 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
1b710 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b     int x = iCol;
1b720 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
1b730 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73 56  id(pTab) && !IsV
1b740 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1b750 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
1b760 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73  3ColumnOfIndex(s
1b770 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1b780 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f  Index(pTab), iCo
1b790 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
1b7a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b7b0 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20  v, op, iTabCur, 
1b7c0 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  x, regOut);.  }.
1b7d0 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
1b7e0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
1b7f0 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
1b800 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  b, iCol, regOut)
1b810 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1b820 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1b830 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
1b840 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
1b850 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
1b860 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
1b870 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
1b880 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ue in a register
1b890 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f  . .**.** An effo
1b8a0 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74  rt is made to st
1b8b0 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
1b8c0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1b8d0 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20   iReg.  This.** 
1b8e0 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65 65  is not garanteee
1b8f0 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28  d for GetColumn(
1b900 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20 63  ) - the result c
1b910 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a  an be stored in.
1b920 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72 2e  ** any register.
1b930 20 20 42 75 74 20 74 68 65 20 72 65 73 75 6c 74    But the result
1b940 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1b950 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73 74  o land in regist
1b960 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47  er iReg.** for G
1b970 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e  etColumnToReg().
1b980 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
1b990 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
1b9a0 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
1b9b0 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
1b9c0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
1b9d0 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
1b9e0 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
1b9f0 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
1ba00 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
1ba10 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
1ba20 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1ba30 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1ba40 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
1ba50 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1ba60 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1ba70 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1ba80 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1ba90 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1baa0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
1bab0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
1bac0 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
1bad0 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
1bae0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1baf0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
1bb00 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1bb10 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
1bb20 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
1bb30 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1bb40 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1bb50 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
1bb60 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
1bb70 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20  for OP_Column + 
1bb80 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64  FLAGS */.){.  Vd
1bb90 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1bba0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1bbb0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1bbc0 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
1bbd0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1bbe0 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1bbf0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1bc00 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
1bc10 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  p->iTable==iTabl
1bc20 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
1bc30 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
1bc40 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
1bc50 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
1bc60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bc70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
1bc80 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
1bc90 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1bca0 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
1bcb0 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
1bcc0 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
1bcd0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1bce0 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
1bcf0 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
1bd00 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
1bd10 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
1bd20 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1bd30 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  , p5);.  }else{ 
1bd40 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78    .    sqlite3Ex
1bd50 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1bd60 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
1bd70 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
1bd80 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
1bd90 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
1bda0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54  prCodeGetColumnT
1bdb0 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a 70  oReg(.  Parse *p
1bdc0 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
1bdd0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1bde0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1bdf0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1be00 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
1be10 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1be20 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
1be30 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1be40 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
1be50 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1be60 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
1be70 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
1be80 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1be90 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
1bea0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1beb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
1bec0 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
1bed0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  /.){.  int r1 = 
1bee0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1bef0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1bf00 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20   pTab, iColumn, 
1bf10 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30 29  iTable, iReg, 0)
1bf20 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65 67  ;.  if( r1!=iReg
1bf30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
1bf40 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
1bf50 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  be, OP_SCopy, r1
1bf60 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iReg);.}.../*.
1bf70 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
1bf80 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
1bf90 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1bfa0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1bfb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1bfc0 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65  .  int i;..#ifde
1bfd0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1bfe0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
1bff0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1c000 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
1c010 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c  {.    printf("CL
1c020 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e  EAR\n");.  }.#en
1c030 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  dif.  for(i=0; i
1c040 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1c050 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  he; i++){.    if
1c060 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  ( pParse->aColCa
1c070 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 0a 20  che[i].tempReg. 
1c080 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e      && pParse->n
1c090 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1c0a0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1c0b0 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  eg).    ){.     
1c0c0 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
1c0d0 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
1c0e0 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d  Reg++] = pParse-
1c0f0 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
1c100 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  eg;.    }.  }.  
1c110 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1c120 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
1c130 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
1c140 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
1c150 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
1c160 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
1c170 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
1c180 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
1c190 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c1a0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1c1b0 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
1c1c0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
1c1d0 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
1c1e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1c1f0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1c200 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74  , iStart, iCount
1c210 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1c220 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
1c230 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
1c240 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
1c250 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
1c260 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
1c270 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
1c280 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1c290 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
1c2a0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c2b0 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
1c2c0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
1c2d0 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
1c2e0 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Reg){.  assert( 
1c2f0 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
1c300 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
1c310 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
1c320 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
1c330 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
1c340 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
1c350 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg);.  sqlite3Ex
1c360 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1c370 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65  arse, iFrom, nRe
1c380 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  g);.}..#if defin
1c390 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1c3a0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1c3b0 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1c3c0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1c3d0 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
1c3e0 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
1c3f0 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
1c400 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
1c410 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1c420 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1c430 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1c440 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ne is used withi
1c450 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
1c460 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
1c470 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65   only.** and doe
1c480 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
1c490 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  a normal build..
1c4a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
1c4b0 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1c4c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c4d0 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
1c4e0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  o){.  int i;.  s
1c4f0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1c500 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
1c510 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1c520 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1c530 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1c540 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
1c550 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
1c560 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
1c570 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20  iTo ) return 1; 
1c580 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
1c590 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1c5a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c5b0 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54  E_DEBUG || SQLIT
1c5c0 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20  E_COVERAGE_TEST 
1c5d0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  */.../*.** Conve
1c5e0 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  rt a scalar expr
1c5f0 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61  ession node to a
1c600 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66   TK_REGISTER ref
1c610 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69  erencing.** regi
1c620 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20  ster iReg.  The 
1c630 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
1c640 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72  re that iReg alr
1c650 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  eady contains.**
1c660 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1c670 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ue for the expre
1c680 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssion..*/.static
1c690 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69   void exprToRegi
1c6a0 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  ster(Expr *p, in
1c6b0 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70  t iReg){.  p->op
1c6c0 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e  2 = p->op;.  p->
1c6d0 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
1c6e0 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20  ;.  p->iTable = 
1c6f0 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61  iReg;.  ExprClea
1c700 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  rProperty(p, EP_
1c710 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Skip);.}../*.** 
1c720 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  Evaluate an expr
1c730 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61  ession (either a
1c740 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61   vector or a sca
1c750 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20  lar expression) 
1c760 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65  and store.** the
1c770 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69   result in conti
1c780 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79  nguous temporary
1c790 20 72 65 67 69 73 74 65 72 73 2e 20 20 52 65 74   registers.  Ret
1c7a0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1c7b0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65  .** the first re
1c7c0 67 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 73  gister used to s
1c7d0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e  tore the result.
1c7e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1c7f0 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65  turned result re
1c800 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
1c810 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68  orary scalar, th
1c820 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a  en also write.**
1c830 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e   that register n
1c840 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72  umber into *piFr
1c850 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20  eeable.  If the 
1c860 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1c870 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e  register.** is n
1c880 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  ot a temporary o
1c890 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
1c8a0 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20  ion is a vector 
1c8b0 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a  set *piFreeable.
1c8c0 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  ** to 0..*/.stat
1c8d0 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56  ic int exprCodeV
1c8e0 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  ector(Parse *pPa
1c8f0 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  rse, Expr *p, in
1c900 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a  t *piFreeable){.
1c910 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20    int iResult;. 
1c920 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73   int nResult = s
1c930 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
1c940 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e  Size(p);.  if( n
1c950 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20  Result==1 ){.   
1c960 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1c970 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1c980 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65  Parse, p, piFree
1c990 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
1c9a0 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20      *piFreeable 
1c9b0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
1c9c0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
1c9d0 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1c9e0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
1c9f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1ca00 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
1ca10 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
1ca20 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1ca30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1ca40 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1ca50 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20  em += nResult;. 
1ca60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1ca70 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20  nResult; i++){. 
1ca80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ca90 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
1caa0 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c  (pParse, p->x.pL
1cab0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
1cac0 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20   i+iResult);.   
1cad0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1cae0 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b   return iResult;
1caf0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
1cb00 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
1cb10 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74  e current Vdbe t
1cb20 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67  o evaluate the g
1cb30 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
1cb40 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20  on.  Attempt to 
1cb50 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1cb60 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74  s in register "t
1cb70 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72  arget"..** Retur
1cb80 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77  n the register w
1cb90 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  here results are
1cba0 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57   stored..**.** W
1cbb0 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ith this routine
1cbc0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75  , there is no gu
1cbd0 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73  arantee that res
1cbe0 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ults will.** be 
1cbf0 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74  stored in target
1cc00 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69  .  The result mi
1cc10 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e  ght be stored in
1cc20 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72   some other.** r
1cc30 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73  egister if it is
1cc40 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64   convenient to d
1cc50 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69  o so.  The calli
1cc60 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  ng function.** m
1cc70 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
1cc80 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f  turn code and mo
1cc90 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74  ve the results t
1cca0 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a  o the desired.**
1ccb0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
1ccc0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1ccd0 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70  eTarget(Parse *p
1cce0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1ccf0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
1cd00 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1cd10 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20  rse->pVdbe;  /* 
1cd20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e  The VM under con
1cd30 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
1cd40 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1cd50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cd60 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64  opcode being cod
1cd70 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65  ed */.  int inRe
1cd80 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20  g = target;     
1cd90 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f    /* Results sto
1cda0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
1cdb0 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72  inReg */.  int r
1cdc0 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20  egFree1 = 0;    
1cdd0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
1cde0 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
1cdf0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1ce00 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
1ce10 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e2 = 0;         
1ce20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
1ce30 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
1ce40 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
1ce50 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20   int r1, r2;    
1ce60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1ce70 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e  rious register n
1ce80 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72  umbers */.  Expr
1ce90 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20   tempX;         
1cea0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
1ceb0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ry expression no
1cec0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d  de */.  int p5 =
1ced0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74   0;..  assert( t
1cee0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
1cef0 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
1cf00 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
1cf10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1cf20 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1cf30 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
1cf40 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
1cf50 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
1cf60 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
1cf70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
1cf80 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
1cf90 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1cfa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1cfb0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1cfc0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1cfd0 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1cfe0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
1cff0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1d000 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
1d010 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
1d020 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
1d030 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1d040 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
1d050 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
1d060 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
1d070 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65  return pCol->iMe
1d080 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  m;.      }else i
1d090 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
1d0a0 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
1d0b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d0c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1d0d0 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
1d0e0 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a  sortingIdxPTab,.
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1d110 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1d120 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
1d130 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1d140 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1d150 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
1d160 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
1d170 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
1d180 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
1d190 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
1d1a0 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d        int iTab =
1d1b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1d1c0 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30        if( iTab<0
1d1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1d1e0 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30  pParse->ckBase>0
1d1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1d200 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43   Generating CHEC
1d210 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  K constraints or
1d220 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20   inserting into 
1d230 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f  partial index */
1d240 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1d250 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  n pExpr->iColumn
1d260 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
1d270 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
1d280 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
1d290 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  oding an express
1d2a0 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72 74  ion that is part
1d2b0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65   of an index whe
1d2c0 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  re column names.
1d2d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
1d2e0 74 68 65 20 69 6e 64 65 78 20 72 65 66 65 72 20  the index refer 
1d2f0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  to the table to 
1d300 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20  which the index 
1d310 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20  belongs */.     
1d320 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72       iTab = pPar
1d330 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20  se->iSelfTab;.  
1d340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d350 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1d360 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1d370 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
1d380 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3a0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1d3b0 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  >iColumn, iTab, 
1d3c0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1d3f0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  2);.    }.    ca
1d400 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
1d410 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
1d420 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
1d430 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1d440 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1d450 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  t;.    }.#ifndef
1d460 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1d470 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1d480 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
1d490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1d4a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d4b0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1d4c0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ue) );.      cod
1d4d0 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e  eReal(v, pExpr->
1d4e0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72  u.zToken, 0, tar
1d4f0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1d500 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1d510 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1d520 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
1d530 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1d540 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1d550 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1d560 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d570 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
1d580 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72  v, target, pExpr
1d590 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1d5a0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1d5b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d5c0 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
1d5d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d5e0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1d5f0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1d600 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1d610 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1d620 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
1d630 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
1d640 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
1d650 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
1d660 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
1d670 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
1d680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1d690 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d6a0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1d6b0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
1d6c0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1d6d0 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
1d6e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1d6f0 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
1d700 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1d710 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27  u.zToken[1]=='\'
1d720 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26  ' );.      z = &
1d730 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1d740 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  2];.      n = sq
1d750 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1d760 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   - 1;.      asse
1d770 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29  rt( z[n]=='\'' )
1d780 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
1d790 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
1d7a0 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
1d7b0 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
1d7c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d7d0 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
1d7e0 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
1d7f0 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
1d800 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1d810 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
1d820 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1d830 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
1d840 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1d850 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d860 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1d870 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d880 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
1d890 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1d8a0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1d8b0 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ken[0]!=0 );.   
1d8c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d8d0 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
1d8e0 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
1d8f0 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
1d900 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
1d910 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b  .zToken[1]!=0 ){
1d920 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1d930 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1d940 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
1d950 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70  Parse->pVList, p
1d960 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1d970 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d980 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1d990 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d  0]=='?' || strcm
1d9a0 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
1d9b0 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n, z)==0 );.    
1d9c0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69      pParse->pVLi
1d9d0 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e  st[0] = 0; /* In
1d9e0 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79  dicate VList may
1d9f0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e   no longer be en
1da00 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  larged */.      
1da10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
1da20 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29  endP4(v, (char*)
1da30 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  z, P4_STATIC);. 
1da40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1da50 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1da60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
1da70 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
1da80 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54  return pExpr->iT
1da90 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  able;.    }.#ifn
1daa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dab0 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
1dac0 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
1dad0 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
1dae0 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
1daf0 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
1db00 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67  ) */.      inReg
1db10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1db20 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1db30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
1db40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
1db50 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1db60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1db70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1db80 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
1db90 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1dba0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1dbb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dbc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dbd0 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61  2(v, OP_Cast, ta
1dbe0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1dc00 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
1dc10 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
1dc20 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65  n, 0));.      te
1dc30 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
1dc40 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
1dc50 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
1dc60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1dc70 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1dc80 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1dc90 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
1dca0 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20   return inReg;. 
1dcb0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1dcc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
1dcd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
1dce0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1dcf0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d  SNOT:.      op =
1dd00 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
1dd10 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
1dd20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f      p5 = SQLITE_
1dd30 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
1dd40 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f   fall-through */
1dd50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1dd60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1dd70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1dd80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1dd90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1dda0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1ddb0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1ddc0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1ddd0 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  eft;.      if( s
1dde0 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
1ddf0 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  or(pLeft) ){.   
1de00 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43       codeVectorC
1de10 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1de20 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70  Expr, target, op
1de30 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , p5);.      }el
1de40 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1de50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1de60 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65  Temp(pParse, pLe
1de70 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1de80 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
1de90 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1dea0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1deb0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1dec0 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  2);.        code
1ded0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1dee0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1def0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1df00 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
1df10 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
1df20 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20  EP2 | p5);.     
1df30 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
1df40 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
1df50 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
1df60 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1df70 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
1df80 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
1df90 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
1dfa0 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
1dfb0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1dfc0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
1dfd0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
1dfe0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
1dff0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
1e000 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1e010 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1e020 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1e030 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1e040 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1e050 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1e060 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1e070 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1e080 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1e090 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1e0a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1e0b0 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1e0c0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
1e0d0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
1e0e0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
1e0f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1e100 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
1e110 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e120 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1e130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e140 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1e150 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1e160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e170 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
1e180 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
1e190 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
1e1a0 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
1e1b0 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
1e1c0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
1e1d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1e1e0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1e1f0 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
1e200 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
1e210 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
1e220 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1e230 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
1e240 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
1e250 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
1e260 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20  OP_And );       
1e270 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e280 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
1e290 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
1e2a0 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20  ==OP_Or );      
1e2b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e2c0 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
1e2d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e2e0 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20  PLUS==OP_Add ); 
1e2f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1e300 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
1e310 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e320 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
1e330 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65  btract );     te
1e340 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
1e350 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  INUS );.      as
1e360 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
1e370 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20  _Remainder );   
1e380 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e390 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
1e3a0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
1e3b0 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
1e3c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e3d0 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b  op==TK_BITAND );
1e3e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e3f0 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
1e400 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74  r );        test
1e410 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1e420 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1e430 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
1e440 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20  _Divide );      
1e450 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e460 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
1e470 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
1e480 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
1e490 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1e4a0 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
1e4b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e4c0 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
1e4d0 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74  ftRight );  test
1e4e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
1e4f0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1e500 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
1e510 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20  OP_Concat );    
1e520 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e530 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
1e540 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e550 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e560 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e570 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1e580 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e590 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e5a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e5b0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1e5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e5d0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
1e5e0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1e5f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e600 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e610 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e620 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1e630 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e640 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
1e650 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
1e660 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1e670 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
1e680 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
1e690 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
1e6a0 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
1e6b0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49  ){.        codeI
1e6c0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1e6d0 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29  Left, 1, target)
1e6e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e6f0 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66   target;.#ifndef
1e700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1e710 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1e720 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
1e730 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
1e740 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1e750 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1e760 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1e770 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1e780 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1e790 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Left->u.zToken, 
1e7a0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1e7b0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e7c0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t;.#endif.      
1e7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1e7e0 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54  empX.op = TK_INT
1e7f0 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65  EGER;.        te
1e800 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49  mpX.flags = EP_I
1e810 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e  ntValue|EP_Token
1e820 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65  Only;.        te
1e830 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30  mpX.u.iValue = 0
1e840 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  ;.        r1 = s
1e850 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e860 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  mp(pParse, &temp
1e870 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
1e880 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
1e890 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e8a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e8b0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29  Left, &regFree2)
1e8c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1e8d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1e8e0 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20  P_Subtract, r2, 
1e8f0 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
1e900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e910 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1e920 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1e930 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e940 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
1e950 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1e960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e970 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
1e980 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ot );   testcase
1e990 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
1e9a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e9b0 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
1e9c0 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63  );         testc
1e9d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
1e9e0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e9f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1ea00 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1ea10 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1ea20 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1ea30 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1ea40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ea50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1ea60 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1ea70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ea80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1ea90 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1eaa0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1eab0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
1eac0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1ead0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1eae0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1eaf0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1eb00 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1eb10 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1eb20 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1eb30 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1eb40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eb50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1eb60 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
1eb70 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
1eb80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1eb90 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1eba0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1ebb0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1ebc0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1ebd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
1ebe0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1ebf0 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
1ec00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1ec10 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1ec20 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
1ec30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ec40 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1ec50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ec60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ec70 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67  Integer, 0, targ
1ec80 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
1ec90 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1eca0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
1ecb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ecc0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1ecd0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
1ece0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
1ecf0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1ed00 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
1ed10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1ed20 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ed30 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ed40 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ed50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1ed60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
1ed70 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
1ed80 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
1ed90 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1eda0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1edb0 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e    return pInfo->
1edc0 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
1edd0 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
1ede0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1edf0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ee00 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1ee10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72    ExprList *pFar
1ee20 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  g;       /* List
1ee30 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1ee40 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
1ee50 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20  int nFarg;      
1ee60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ee70 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1ee80 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
1ee90 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
1eea0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
1eeb0 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
1eec0 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  n object */.    
1eed0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
1eee0 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
1eef0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1ef00 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74  .      u32 const
1ef10 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Mask = 0;     /*
1ef20 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f   Mask of functio
1ef30 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  n arguments that
1ef40 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f   are constant */
1ef50 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ef70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1ef80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1ef90 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1efa0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1efb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1efc0 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
1efd0 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20  NC(db);      /* 
1efe0 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  The text encodin
1eff0 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64  g used by this d
1f000 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
1f010 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
1f020 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c  = 0;    /* A col
1f030 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1f040 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f  */..      if( Co
1f050 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
1f060 73 65 29 20 26 26 20 73 71 6c 69 74 65 33 45 78  se) && sqlite3Ex
1f070 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
1f080 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  oin(pExpr) ){.  
1f090 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e        /* SQL fun
1f0a0 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78  ctions can be ex
1f0b0 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20  pensive. So try 
1f0c0 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74  to move constant
1f0d0 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20   functions.     
1f0e0 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65     ** out of the
1f0f0 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65   inner loop, eve
1f100 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
1f110 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79  an extra OP_Copy
1f120 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  . */.        ret
1f130 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1f140 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
1f150 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20  , pExpr, -1);.  
1f160 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
1f170 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1f180 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1f190 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1f1a0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1f1b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1f1c0 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
1f1d0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
1f1e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f1f0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
1f200 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1f210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
1f220 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
1f230 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
1f240 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1f250 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f260 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1f270 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
1f280 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f290 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
1f2a0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1f2b0 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72  on(db, zId, nFar
1f2c0 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64  g, enc, 0);.#ifd
1f2d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1f2e0 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e  _UNKNOWN_SQL_FUN
1f2f0 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  CTION.      if( 
1f300 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73  pDef==0 && pPars
1f310 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1f320 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1f330 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1f340 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20  (db, "unknown", 
1f350 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1f360 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1f370 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1f380 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c   || pDef->xFinal
1f390 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
1f3a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1f3b0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
1f3c0 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28  wn function: %s(
1f3d0 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  )", zId);.      
1f3e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1f3f0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d  ..      /* Attem
1f400 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c  pt a direct impl
1f410 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1f420 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45  e built-in COALE
1f430 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20  SCE() and.      
1f440 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  ** IFNULL() func
1f450 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f  tions.  This avo
1f460 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ids unnecessary 
1f470 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20  evaluation of.  
1f480 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
1f490 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
1f4a0 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
1f4b0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1f4c0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1f4d0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1f4e0 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
1f4f0 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
1f500 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
1f510 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1f520 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f530 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
1f540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1f550 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1f560 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1f570 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f580 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
1f590 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1f5a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f5b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1f5c0 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
1f5d0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
1f5e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1f5f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
1f600 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f610 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1f620 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  target, 1);.    
1f630 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f640 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1f650 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1f660 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1f670 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
1f680 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1f690 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1f6a0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1f6b0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1f6c0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1f6d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f6e0 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
1f6f0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
1f700 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1f710 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c    /* The UNLIKEL
1f720 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  Y() function is 
1f730 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65  a no-op.  The re
1f740 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75  sult is the valu
1f750 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
1f760 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1f770 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f780 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1f790 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1f7a0 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
1f7b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1f7c0 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20  Farg>=1 );.     
1f7d0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1f7e0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1f7f0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1f800 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
1f810 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66  t);.      }..#if
1f820 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f830 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46  .      /* The AF
1f840 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f  FINITY() functio
1f850 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  n evaluates to a
1f860 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
1f870 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20  cribes.      ** 
1f880 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
1f890 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
1f8a0 74 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  t.  This is used
1f8b0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a   for testing of.
1f8c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
1f8d0 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a  ite type logic..
1f8e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f8f0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
1f900 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1f910 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20  _AFFINITY ){.   
1f920 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1f930 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c  *azAff[] = { "bl
1f940 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75  ob", "text", "nu
1f950 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72  meric", "integer
1f960 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20  ", "real" };.   
1f970 20 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20       char aff;. 
1f980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1f990 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
1f9a0 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1f9b0 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 46 61  ExprAffinity(pFa
1f9c0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
1f9d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f9e0 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
1f9f0 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20  , target, .     
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 20 20 20 61 66 66 20 3f 20 61           aff ? a
1fa20 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f  zAff[aff-SQLITE_
1fa30 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e  AFF_BLOB] : "non
1fa40 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e");.        ret
1fa50 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1fa60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1fa70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
1fa80 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1fa90 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
1faa0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1fab0 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
1fac0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1fad0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
1fae0 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
1faf0 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
1fb00 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
1fb10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1fb20 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
1fb30 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1fb40 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
1fb50 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
1fb60 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1fb70 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1fb80 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1fb90 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1fba0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fbb0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1fbc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
1fbd0 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
1fbe0 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
1fbf0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
1fc00 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1fc10 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
1fc20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fc30 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
1fc40 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1fc50 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
1fc60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1fc70 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
1fc80 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
1fc90 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
1fca0 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
1fcb0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
1fcc0 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
1fcd0 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
1fce0 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
1fcf0 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
1fd00 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
1fd10 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
1fd20 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
1fd30 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
1fd40 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
1fd50 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
1fd60 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
1fd70 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1fd80 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
1fd90 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
1fda0 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
1fdb0 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
1fdc0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
1fdd0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
1fde0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1fdf0 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
1fe00 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
1fe10 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
1fe20 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
1fe30 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
1fe40 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
1fe50 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
1fe60 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
1fe70 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1fe80 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
1fe90 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
1fea0 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
1feb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1fec0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
1fed0 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
1fee0 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
1fef0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ff00 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1ff10 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
1ff20 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
1ff30 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1ff40 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
1ff60 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1ff70 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1ff80 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
1ff90 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
1ffa0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1ffb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ffc0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1ffd0 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1ffe0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1fff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20000 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
20010 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
20020 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20040 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
20050 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c  _DUP|SQLITE_ECEL
20060 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20  _FACTOR);.      
20070 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20080 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20  hePop(pParse);  
20090 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
200a0 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
200b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
200c0 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
200d0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
200e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
200f0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
20100 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
20110 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
20120 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
20130 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
20140 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
20150 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
20160 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
20170 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
20180 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
20190 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
201a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
201b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
201c0 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
201d0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
201e0 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
201f0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
20200 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
20210 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
20220 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
20230 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
20240 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
20250 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
20260 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
20270 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
20280 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
20290 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
202a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
202b0 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
202c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
202d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
202e0 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
202f0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
20300 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
20310 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
20320 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
20330 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
20340 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
20350 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
20360 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
20370 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
20380 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
20390 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
203a0 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
203b0 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
203c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
203d0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
203e0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
203f0 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
20400 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
20410 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
20420 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
20430 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
20440 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
20450 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
20460 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
20470 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
20480 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
20490 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
204a0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
204b0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
204c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
204d0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
204e0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
204f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20500 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
20510 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
20520 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
20530 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
20540 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
20550 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
20560 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63   OP_Function0, c
20570 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61  onstMask, r1, ta
20580 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
205a0 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
205b0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
205c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
205d0 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
205e0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
205f0 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30   && constMask==0
20600 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20610 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
20620 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
20630 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
20640 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
20650 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
20660 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
20670 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
20680 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
20690 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
206a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
206b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
206c0 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ( op==TK_EXISTS 
206d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
206e0 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  e( op==TK_SELECT
206f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
20700 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28  ==TK_SELECT && (
20710 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  nCol = pExpr->x.
20720 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
20730 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20  >nExpr)!=1 ){.  
20740 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
20750 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
20760 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  se, nCol, 1);.  
20770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20780 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
20790 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
207a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
207b0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
207c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
207d0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
207e0 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  CT_COLUMN: {.   
207f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
20800 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
20810 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
20820 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
20830 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71  eft->iTable = sq
20840 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
20850 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
20860 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a  ->pLeft, 0, 0);.
20870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20880 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
20890 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
208a0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pLeft->op==TK_S
208b0 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
208c0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
208d0 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72  .       && pExpr
208e0 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73  ->iTable!=(n = s
208f0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
20900 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
20910 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  t)) .      ){.  
20920 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
20930 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
20940 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e  d columns assign
20950 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20  ed %d values",. 
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20980 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29  Expr->iTable, n)
20990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
209a0 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c  return pExpr->pL
209b0 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45  eft->iTable + pE
209c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
209d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
209e0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
209f0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
20a00 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20a10 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
20a20 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
20a30 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20a40 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
20a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20a60 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
20a70 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
20a80 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
20a90 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
20aa0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
20ab0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
20ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20ad0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
20ae0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20af0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20b00 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
20b10 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
20b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20b30 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
20b40 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20  target, 0);.    
20b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20b60 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
20b70 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
20b80 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
20b90 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
20ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
20bb0 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
20bc0 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
20bd0 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
20be0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
20bf0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
20c00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
20c10 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
20c20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
20c30 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
20c40 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
20c50 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
20c60 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
20c70 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
20c80 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
20c90 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
20ca0 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
20cb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
20cc0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78  WEEN: {.      ex
20cd0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
20ce0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
20cf0 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  get, 0, 0);.    
20d00 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
20d10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20d20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73  TK_SPAN:.    cas
20d30 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20  e TK_COLLATE: . 
20d40 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
20d50 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
20d60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20d70 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
20d80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
20d90 67 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  get);.    }..   
20da0 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
20db0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
20dc0 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
20dd0 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
20de0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
20df0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
20e00 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
20e10 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
20e20 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
20e30 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
20e40 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
20e50 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
20e60 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
20e70 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
20e80 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
20e90 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
20ea0 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
20eb0 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
20ec0 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
20ed0 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
20ee0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
20ef0 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
20f00 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
20f10 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
20f20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
20f30 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
20f40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
20f50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
20f60 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
20f70 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
20f80 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
20f90 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
20fa0 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
20fb0 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
20fc0 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
20fd0 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
20fe0 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
20ff0 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
21000 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
21010 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
21020 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
21030 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
21040 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
21050 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
21060 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
21070 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
21080 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
21090 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
210a0 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
210b0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
210c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
210d0 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
210e0 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
210f0 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
21100 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
21110 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
21120 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
21130 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
21140 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
21150 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
21160 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
21170 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
21180 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
21190 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
211a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
211b0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
211c0 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
211d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
211e0 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
211f0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
21200 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
21210 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
21220 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
21230 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
21240 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
21250 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
21260 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
21270 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
21280 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
21290 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
212a0 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
212b0 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
212c0 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
212d0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
212e0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
212f0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
21300 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
21310 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
21320 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
21330 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
21340 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
21350 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
21360 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
21370 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
21380 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
21390 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
213a0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
213b0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
213c0 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
213d0 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
213e0 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
213f0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
21400 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
21410 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
21420 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21430 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
21440 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
21450 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21460 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
21470 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
21480 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
21490 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
214a0 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
214b0 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
214c0 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
214d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
214e0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
214f0 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
21500 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21510 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
21520 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
21530 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
21540 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
21550 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
21560 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
21570 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
21580 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
21590 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
215a0 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
215b0 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  real..      **. 
215c0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
215d0 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36  -OF: R-60985-576
215e0 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63  62 SQLite will c
215f0 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65  onvert the value
21600 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a   back to.      *
21610 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
21620 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67   when extracting
21630 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63   it from the rec
21640 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ord.  */.      i
21650 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
21660 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  n>=0 .       && 
21670 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
21680 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  ->iColumn].affin
21690 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
216a0 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20  REAL.      ){.  
216b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
216c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
216d0 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67  alAffinity, targ
216e0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  et);.      }.#en
216f0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
21700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
21710 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20   TK_VECTOR: {.  
21720 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
21730 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
21740 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
21750 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21760 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
21770 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
21780 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
21790 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
217a0 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
217b0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
217c0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
217d0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
217e0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE 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 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
21850 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
21860 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
21870 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
21880 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
21890 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
218a0 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
218b0 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
218c0 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
218d0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
218e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
218f0 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
21900 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
21910 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
21920 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  in the last elem
21930 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e  ent of pExpr->x.
21940 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e  pList if pExpr->
21950 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69  x.pList->nExpr i
21960 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54  s.    ** odd.  T
21970 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
21980 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e  ional.  If the n
21990 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
219a0 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20  s in x.pList.   
219b0 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65   ** is even, the
219c0 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61  n Y is omitted a
219d0 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73  nd the "otherwis
219e0 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  e" result is NUL
219f0 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
21a00 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
21a10 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
21a20 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
21a30 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
21a40 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
21a50 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
21a60 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
21a70 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
21a80 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
21a90 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
21aa0 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
21ab0 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
21ac0 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
21ad0 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
21ae0 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
21af0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
21b00 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
21b10 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
21b20 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
21b50 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
21b60 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
21b70 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b90 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
21ba0 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
21bb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
21bc0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
21be0 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
21bf0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
21c00 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21c30 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
21c40 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
21c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c60 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
21c70 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
21c80 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
21c90 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
21ca0 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
21cb0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
21cc0 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
21cf0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
21d00 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
21d30 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
21d40 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
21d70 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
21d80 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
21d90 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
21da0 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
21db0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
21dc0 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
21dd0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
21de0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
21df0 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
21e00 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
21e10 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
21e20 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
21e30 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
21e40 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
21e50 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
21e60 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
21e70 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
21e80 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
21e90 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
21ea0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21eb0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
21ec0 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
21ed0 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
21ee0 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70        tempX = *p
21ef0 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
21f00 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
21f10 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
21f20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
21f30 28 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64  (&tempX, exprCod
21f40 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
21f50 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65  &tempX, &regFree
21f60 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1));.        tes
21f70 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
21f80 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  =0 );.        me
21f90 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c  mset(&opCompare,
21fa0 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d   0, sizeof(opCom
21fb0 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20  pare));.        
21fc0 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
21fd0 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
21fe0 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
21ff0 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20  &tempX;.        
22000 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
22010 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  re;.        /* T
22020 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63  icket b351d95f9c
22030 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38  d5ef17e9d9dbae18
22040 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a  f5ca8611190001:.
22050 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76          ** The v
22060 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31  alue in regFree1
22070 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79   might get SCopy
22080 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  -ed into the fil
22090 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  e result..      
220a0 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72    ** So make sur
220b0 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72  e that the regFr
220c0 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20  ee1 register is 
220d0 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f  not reused for o
220e0 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
220f0 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73  purposes and pos
22100 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65  sibly overwritte
22110 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  n.  */.        r
22120 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20  egFree1 = 0;.   
22130 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
22140 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69  =0; i<nExpr-1; i
22150 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
22160 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
22170 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
22180 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
22190 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
221a0 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
221b0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
221c0 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
221d0 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
221e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
221f0 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
22200 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
22210 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
22220 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
22230 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
22240 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
22250 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
22260 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
22270 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22280 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
22290 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
222a0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
222b0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
222c0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
222d0 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
222e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
222f0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
22300 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
22310 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
22320 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
22330 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22340 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e  e3VdbeGoto(v, en
22350 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
22360 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22370 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
22380 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22390 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
223a0 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
223b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e    }.      if( (n
223c0 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20  Expr&1)!=0 ){.  
223d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
223e0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
223f0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
22400 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
22410 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45  se, pEList->a[nE
22420 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61  xpr-1].pExpr, ta
22430 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
22440 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
22450 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
22460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22480 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
22490 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
224a0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
224b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
224c0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
224d0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20  rse->nErr>0 .   
224e0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
224f0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d  e->iCacheLevel==
22500 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20  iCacheLevel );. 
22510 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22520 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
22530 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
22540 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
22550 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22560 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
22570 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
22580 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
22590 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
225a0 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
225b0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
225c0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
225d0 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  rt.           ||
225e0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
225f0 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
22600 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
22610 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
22620 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
22630 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
22640 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
22650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
22660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
22690 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
226a0 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
226b0 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
226c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
226d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
226e0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
226f0 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
22700 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
22710 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
22720 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
22730 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
22740 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
22750 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
22760 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
22770 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity==OE_Ignore 
22780 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22790 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
227a0 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
227b0 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
227c0 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70   OE_Ignore, 0, p
227d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
227e0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
227f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
22800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22810 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
22820 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53  traint(pParse, S
22830 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
22840 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20  _TRIGGER,.      
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
22870 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e  ffinity, pExpr->
22880 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b  u.zToken, 0, 0);
22890 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
228a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
228b0 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
228c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
228d0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
228e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
228f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
22900 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
22910 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
22920 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75  ./*.** Factor ou
22930 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68  t the code of th
22940 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
22950 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61  on to initializa
22960 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  tion time..**.**
22970 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20 74   If regDest>=0 t
22980 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
22990 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20  s always stored 
229a0 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  in that register
229b0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73 75   and the.** resu
229c0 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61 62  lt is not reusab
229d0 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74 3c  le.  If regDest<
229e0 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  0 then this rout
229f0 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20 0a  ine is free to .
22a00 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  ** store the val
22a10 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74 20  ue whereever it 
22a20 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  wants.  The regi
22a30 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20 65  ster where the e
22a40 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73  xpression .** is
22a50 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75 72   stored is retur
22a60 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44 65  ned.  When regDe
22a70 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74 69  st<0, two identi
22a80 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  cal expressions 
22a90 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  will.** code to 
22aa0 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
22ab0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
22ac0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
22ad0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22ae0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
22af0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
22b00 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
22b10 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
22b20 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68   to code when th
22b30 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a  e VDBE initializ
22b40 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  es */.  int regD
22b50 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  est       /* Sto
22b60 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
22b70 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
22b80 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
22b90 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
22ba0 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
22bb0 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
22bc0 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
22bd0 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20    if( regDest<0 
22be0 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  && p ){.    stru
22bf0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
22c00 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74   *pItem;.    int
22c10 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   i;.    for(pIte
22c20 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78  m=p->a, i=p->nEx
22c30 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b  pr; i>0; pItem++
22c40 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  , i--){.      if
22c50 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c  ( pItem->reusabl
22c60 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  e && sqlite3Expr
22c70 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
22c80 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d  Expr,pExpr,-1)==
22c90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
22ca0 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f  urn pItem->u.iCo
22cb0 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20  nstExprReg;.    
22cc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
22cd0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
22ce0 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
22cf0 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
22d00 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  p = sqlite3ExprL
22d10 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
22d20 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  , p, pExpr);.  i
22d30 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72  f( p ){.     str
22d40 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
22d50 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
22d60 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  [p->nExpr-1];.  
22d70 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62     pItem->reusab
22d80 6c 65 20 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a  le = regDest<0;.
22d90 20 20 20 20 20 69 66 28 20 72 65 67 44 65 73 74       if( regDest
22da0 3c 30 20 29 20 72 65 67 44 65 73 74 20 3d 20 2b  <0 ) regDest = +
22db0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22dc0 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f      pItem->u.iCo
22dd0 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67  nstExprReg = reg
22de0 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72  Dest;.  }.  pPar
22df0 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d  se->pConstExpr =
22e00 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67   p;.  return reg
22e10 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Dest;.}../*.** G
22e20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
22e30 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
22e40 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
22e50 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
22e60 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
22e70 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
22e80 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
22e90 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
22ea0 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
22eb0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
22ec0 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
22ed0 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
22ee0 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
22ef0 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
22f00 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
22f10 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
22f20 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
22f30 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
22f40 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
22f50 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
22f60 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
22f70 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74  is a constant, t
22f80 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
22f90 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20   might generate 
22fa0 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  this.** code to 
22fb0 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65  fill the registe
22fc0 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  r in the initial
22fd0 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20  ization section 
22fe0 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  of the.** VDBE p
22ff0 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72  rogram, in order
23000 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75   to factor it ou
23010 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74  t of the evaluat
23020 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ion loop..*/.int
23030 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23040 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
23050 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
23060 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
23070 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d  nt r2;.  pExpr =
23080 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
23090 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a  Collate(pExpr);.
230a0 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
230b0 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26  rOk(pParse).   &
230c0 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
230d0 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73  REGISTER.   && s
230e0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
230f0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
23100 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65  r).  ){.    *pRe
23110 67 20 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d  g  = 0;.    r2 =
23120 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23130 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
23140 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  Expr, -1);.  }el
23150 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d  se{.    int r1 =
23160 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
23170 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
23180 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
23190 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
231a0 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
231b0 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b     if( r2==r1 ){
231c0 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72  .      *pReg = r
231d0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
231e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
231f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
23200 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52  , r1);.      *pR
23210 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
23220 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d  }.  return r2;.}
23230 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23240 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
23250 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
23260 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
23270 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
23280 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
23290 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
232a0 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
232b0 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
232c0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
232d0 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
232e0 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
232f0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
23300 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
23310 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
23320 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
23330 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
23340 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
23350 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
23360 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
23370 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71  GISTER ){.    sq
23380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23390 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
233a0 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69  P_Copy, pExpr->i
233b0 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a  Table, target);.
233c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52    }else{.    inR
233d0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
233e0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
233f0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
23400 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
23410 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
23420 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
23430 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
23440 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
23450 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
23460 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73  pVdbe ){.      s
23470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23480 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
23490 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
234a0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
234b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
234c0 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f  e a transient co
234d0 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
234e0 20 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20   pExpr and then 
234f0 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a  code it using.**
23500 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23510 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
23520 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  e works just lik
23530 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
23540 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68  e().** except th
23550 61 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  at the input exp
23560 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61  ression is guara
23570 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68  nteed to be unch
23580 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
23590 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
235a0 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
235b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
235c0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71  nt target){.  sq
235d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
235e0 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20  se->db;.  pExpr 
235f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
23600 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
23610 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
23620 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65  cFailed ) sqlite
23630 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
23640 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
23650 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
23660 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
23670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
23680 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
23690 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
236a0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
236b0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
236c0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
236d0 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
236e0 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
236f0 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
23700 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
23710 61 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65  arget.  If the e
23720 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
23730 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
23740 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
23750 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65  t choose to code
23760 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
23770 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  at initializatio
23780 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
23790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46  sqlite3ExprCodeF
237a0 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20  actorable(Parse 
237b0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
237c0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
237d0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
237e0 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26  >okConstFactor &
237f0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
23800 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
23810 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
23820 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
23830 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
23840 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
23850 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23860 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
23870 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
23880 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23890 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74  ode that evaluat
238a0 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
238b0 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
238c0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
238d0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
238e0 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
238f0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
23900 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
23910 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
23920 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
23930 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
23940 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
23950 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
23960 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
23970 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
23980 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
23990 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
239a0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
239b0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
239c0 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
239d0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
239e0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
239f0 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
23a00 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
23a10 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
23a20 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
23a30 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76  are reused..*/.v
23a40 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
23a50 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
23a60 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
23a70 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
23a80 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
23a90 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
23aa0 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61    int iMem;..  a
23ab0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
23ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
23ad0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
23ae0 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  TER );.  sqlite3
23af0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
23b00 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
23b10 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  .  iMem = ++pPar
23b20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
23b30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23b40 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74   OP_Copy, target
23b50 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54  , iMem);.  exprT
23b60 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c  oRegister(pExpr,
23b70 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iMem);.}../*.**
23b80 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
23b90 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
23ba0 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
23bb0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
23bc0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
23bd0 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
23be0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
23bf0 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
23c00 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
23c10 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
23c20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
23c30 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uated..**.** The
23c40 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
23c50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
23c60 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  he arguments fro
23c70 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65  m being.** fille
23c80 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79  d using OP_SCopy
23c90 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20  .  OP_Copy must 
23ca0 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  be used instead.
23cb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
23cc0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72  E_ECEL_FACTOR ar
23cd0 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f  gument allows co
23ce0 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
23cf0 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72   to be.** factor
23d00 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74  ed out into init
23d10 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e  ialization code.
23d20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
23d30 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20  E_ECEL_REF flag 
23d40 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65  means that expre
23d50 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69  ssions in the li
23d60 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c  st with.** ExprL
23d70 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64  ist.a[].u.x.iOrd
23d80 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61  erByCol>0 have a
23d90 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c  lready been eval
23da0 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64  uated and stored
23db0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73  .** in registers
23dc0 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20   at srcReg, and 
23dd0 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e  so the value can
23de0 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20   be copied from 
23df0 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  there..*/.int sq
23e00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
23e10 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
23e20 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
23e30 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23e40 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
23e50 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
23e60 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
23e70 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
23e80 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
23e90 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
23ea0 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
23eb0 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
23ec0 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
23ed0 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
23ee0 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
23ef0 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
23f00 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
23f10 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
23f20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
23f30 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
23f40 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
23f50 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
23f60 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
23f70 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
23f80 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
23f90 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
23fa0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
23fb0 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
23fc0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
23fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
23fe0 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
23ff0 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
24000 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
24010 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
24020 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
24030 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
24040 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
24050 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
24060 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
24070 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
24080 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
24090 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
240a0 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
240b0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66  Expr;.    if( (f
240c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
240d0 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
240e0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
240f0 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
24100 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
24110 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
24120 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20  ITREF ){.       
24130 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d   i--;.        n-
24140 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
24150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24160 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
24170 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c  yOp, j+srcReg-1,
24180 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
24190 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
241a0 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
241b0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
241c0 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
241d0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
241e0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
241f0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
24200 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24210 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d  target+i);.    }
24220 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
24230 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
24240 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24250 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24260 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66  get+i);.      if
24270 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
24280 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  i ){.        Vdb
24290 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
242a0 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50    if( copyOp==OP
242b0 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
242c0 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64  & (pOp=sqlite3Vd
242d0 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d  beGetOp(v, -1))-
242e0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79  >opcode==OP_Copy
242f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
24300 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p1+pOp->p3+1==
24310 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  inReg.         &
24320 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
24330 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20  3+1==target+i.  
24340 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
24350 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20     pOp->p3++;.  
24360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24380 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
24390 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  Op, inReg, targe
243a0 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+i);.        }.
243b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
243c0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
243d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
243e0 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45  code for a BETWE
243f0 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  EN operator..**.
24400 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
24410 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68  y AND z.**.** Th
24420 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76  e above is equiv
24430 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20  alent to .**.** 
24440 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
24450 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61  .**.** Code it a
24460 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
24470 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
24480 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
24490 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f  on.** eliminatio
244a0 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68  n of x..**.** Th
244b0 65 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65  e xJumpIf parame
244c0 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64  ter determines d
244d0 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  etails:.**.**   
244e0 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20   NULL:          
244f0 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74           Store t
24500 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
24510 74 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a  t in reg[dest].*
24520 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
24530 49 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d  IfTrue:      Jum
24540 70 20 74 6f 20 64 65 73 74 20 69 66 20 74 72 75  p to dest if tru
24550 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45  e.**    sqlite3E
24560 78 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20  xprIfFalse:     
24570 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20  Jump to dest if 
24580 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  false.**.** The 
24590 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d  jumpIfNull param
245a0 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
245b0 69 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55  if xJumpIf is NU
245c0 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
245d0 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65  id exprCodeBetwe
245e0 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
245f0 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
24600 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
24610 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
24620 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
24630 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54        /* The BET
24640 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WEEN expression 
24650 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
24660 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
24670 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74  estination or st
24680 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a  orage location *
24690 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70  /.  void (*xJump
246a0 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69  )(Parse*,Expr*,i
246b0 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69  nt,int), /* Acti
246c0 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20  on to take */.  
246d0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
246e0 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
246f0 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
24700 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  N is NULL */.){.
24710 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
24720 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
24730 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
24740 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
24750 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
24760 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
24770 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
24780 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
24790 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
247a0 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
247b0 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
247c0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
247d0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
247e0 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
247f0 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
24800 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f  /...  memset(&co
24810 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f  mpLeft, 0, sizeo
24820 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73  f(Expr));.  mems
24830 65 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30  et(&compRight, 0
24840 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
24850 0a 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41  .  memset(&exprA
24860 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  nd, 0, sizeof(Ex
24870 70 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  pr));..  assert(
24880 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
24890 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
248a0 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72  elect) );.  expr
248b0 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
248c0 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  t;.  exprAnd.op 
248d0 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
248e0 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
248f0 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
24900 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
24910 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
24920 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
24930 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
24940 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
24950 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
24960 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
24970 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
24980 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
24990 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
249a0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
249b0 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
249c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
249d0 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
249e0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65  xprToRegister(&e
249f0 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65  xprX, exprCodeVe
24a00 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78  ctor(pParse, &ex
24a10 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  prX, &regFree1))
24a20 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b  ;.  if( xJump ){
24a30 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73  .    xJump(pPars
24a40 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
24a50 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
24a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
24a70 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73  Mark the express
24a80 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f  ion is being fro
24a90 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
24aa0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
24ab0 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  in.    ** so tha
24ac0 74 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70  t the sqlite3Exp
24ad0 72 43 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f  rCodeTarget() ro
24ae0 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61  utine will not a
24af0 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20  ttempt to move. 
24b00 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68     ** it into th
24b10 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78  e Parse.pConstEx
24b20 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f  pr list.  We sho
24b30 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62 69  uld use a new bi
24b40 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20  t for this,.    
24b50 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20  ** for clarity, 
24b60 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f  but we are out o
24b70 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78  f bits in the Ex
24b80 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73  pr.flags field s
24b90 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65  o we.    ** have
24ba0 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 45 50   to reuse the EP
24bb0 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20  _FromJoin bit.  
24bc0 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65  Bummer. */.    e
24bd0 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50  xprX.flags |= EP
24be0 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73  _FromJoin;.    s
24bf0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
24c00 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78  rget(pParse, &ex
24c10 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20  prAnd, dest);.  
24c20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
24c30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
24c40 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20  , regFree1);..  
24c50 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61  /* Ensure adequa
24c60 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65  te test coverage
24c70 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
24c80 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
24c90 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
24ca0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
24cb0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
24cc0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24cd0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24ce0 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
24cf0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
24d00 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
24d10 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24d20 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
24d30 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
24d40 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
24d50 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
24d60 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
24d70 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
24d80 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
24d90 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
24da0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
24db0 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
24dc0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
24dd0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
24de0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
24df0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
24e00 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
24e10 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
24e20 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
24e30 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
24e40 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
24e50 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
24e60 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
24e70 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
24e80 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
24e90 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
24ea0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
24eb0 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
24ec0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30  stcase( xJump==0
24ed0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   );.}../*.** Gen
24ee0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
24ef0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
24f00 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
24f10 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
24f20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
24f30 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
24f40 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
24f50 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
24f60 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
24f70 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
24f80 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
24f90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24fa0 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
24fb0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
24fc0 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
24fd0 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
24fe0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
24ff0 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
25000 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
25010 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
25020 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
25030 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
25040 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
25050 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
25060 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
25070 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
25080 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
25090 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
250a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
250b0 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
250c0 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
250d0 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
250e0 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
250f0 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
25100 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
25110 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
25120 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
25130 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
25140 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
25150 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
25160 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
25170 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
25180 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
25190 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
251a0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
251b0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
251c0 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
251d0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
251e0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
251f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
25200 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
25210 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
25220 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
25230 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
25240 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
25250 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
25260 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
25270 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20  EVER(v==0) )    
25280 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69   return;  /* Exi
25290 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
252a0 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
252b0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
252c0 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75  pExpr==0) ) retu
252d0 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74  rn;  /* No way t
252e0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a  his can happen *
252f0 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  /.  op = pExpr->
25300 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
25310 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
25320 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
25330 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
25340 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25350 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25360 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25370 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25380 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25390 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
253a0 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
253b0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
253c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
253d0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
253e0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
253f0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
25400 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
25410 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
25420 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
25430 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
25440 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
25450 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25460 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
25470 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25480 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
25490 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  R: {.      testc
254a0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
254b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
254c0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
254d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
254e0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
254f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
25500 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
25510 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
25520 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25530 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
25540 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
25550 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
25560 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25570 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
25580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25590 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
255a0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
255b0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
255c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
255d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
255e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
255f0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
25600 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
25610 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25620 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
25630 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
25640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
25650 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
25660 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
25670 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
25680 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
25690 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
256a0 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  NE;.      jumpIf
256b0 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
256c0 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
256d0 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
256e0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
256f0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
25700 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
25710 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
25720 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
25730 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
25740 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
25750 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
25760 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
25770 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
25780 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25790 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
257a0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
257b0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
257c0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
257d0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
257e0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
257f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
25800 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25810 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
25820 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
25830 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
25840 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
25850 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
25860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25870 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
25880 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
25890 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
258a0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
258b0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
258c0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
258d0 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
258e0 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
258f0 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
25900 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
25910 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
25920 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
25930 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
25940 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
25950 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
25960 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
25970 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
25980 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
25990 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
259a0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
259b0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
259c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
259d0 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
259e0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
259f0 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
25a00 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
25a10 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
25a20 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
25a30 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
25a40 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
25a50 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
25a60 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
25a70 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
25a80 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
25a90 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
25aa0 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
25ab0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
25ac0 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
25ad0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
25ae0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
25af0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
25b00 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
25b10 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
25b20 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
25b30 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
25b40 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
25b50 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
25b60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
25b70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
25b80 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
25b90 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
25ba0 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
25bb0 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
25bc0 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
25bd0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
25be0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
25bf0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
25c00 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
25c10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
25c20 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
25c30 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
25c40 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
25c50 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
25c60 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
25c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25c80 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
25c90 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62  dest);.      Vdb
25ca0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
25cb0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
25cc0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
25cd0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
25ce0 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
25cf0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
25d00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
25d10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
25d20 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
25d30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25d40 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
25d50 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
25d60 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
25d70 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c  pExpr, dest, sql
25d80 69 74 65 33 45 78 70 72 49 66 54 72 75 65 2c 20  ite3ExprIfTrue, 
25d90 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
25da0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25db0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25dc0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
25dd0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
25de0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
25df0 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
25e00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
25e10 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
25e20 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c  Null = jumpIfNul
25e30 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49  l ? dest : destI
25e40 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71  fFalse;.      sq
25e50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
25e60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
25e70 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
25e80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
25e90 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
25ea0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
25eb0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
25ec0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
25ed0 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72  False);.      br
25ee0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
25ef0 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
25f00 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
25f10 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  r:.      if( exp
25f20 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
25f30 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
25f40 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
25f50 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
25f60 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
25f70 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ysFalse(pExpr) )
25f80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d  {.        /* No-
25f90 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
25fa0 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
25fb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
25fc0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
25fd0 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
25fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25ff0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
26000 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  f, r1, dest, jum
26010 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
26020 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26030 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
26040 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
26050 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
26060 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26070 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26080 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
26090 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
260a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
260b0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
260c0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
260d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
260e0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20  se, regFree2);  
260f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
26100 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
26110 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
26120 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
26130 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
26140 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
26150 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
26160 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
26170 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
26180 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
26190 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
261a0 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
261b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
261c0 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
261d0 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
261e0 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
261f0 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
26200 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
26210 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26220 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75  LL or fall throu
26230 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  gh if jumpIfNull
26240 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69  .** is 0..*/.voi
26250 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
26260 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
26270 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
26280 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
26290 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
262a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
262b0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
262c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
262d0 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
262e0 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
262f0 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
26300 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
26310 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
26320 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
26330 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
26340 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
26350 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65  rn; /* Existence
26360 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
26370 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
26380 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20  if( pExpr==0 )  
26390 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
263a0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
263b0 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
263c0 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
263d0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
263e0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
263f0 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
26400 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
26410 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
26420 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
26430 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
26440 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
26450 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
26460 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
26470 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
26480 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
26490 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
264a0 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
264b0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
264c0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
264e0 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
264f0 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
26500 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
26510 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
26520 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
26530 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
26540 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
26550 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
26560 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
26570 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
26580 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
26590 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
265a0 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
265b0 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
265c0 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
265d0 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
265e0 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
265f0 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
26600 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
26610 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
26620 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
26630 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
26640 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
26650 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
26660 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
26670 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
26680 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
26690 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
266a0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
266b0 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
266c0 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
266d0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
266e0 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
266f0 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
26700 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
26710 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
26720 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
26730 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
26740 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
26750 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
26760 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
26770 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
26780 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
26790 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
267a0 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
267b0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
267c0 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
267d0 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
267e0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
267f0 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
26800 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
26810 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
26820 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
26830 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
26840 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
26850 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
26860 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26870 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26880 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26890 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
268a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
268b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
268c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
268d0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
268e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
268f0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
26900 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
26910 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26920 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
26930 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
26940 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
26950 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26960 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
26970 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
26980 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
26990 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
269a0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
269b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
269c0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
269d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
269e0 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
269f0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
26a00 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
26a10 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
26a20 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
26a30 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
26a40 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
26a50 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
26a60 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
26a70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26a80 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
26a90 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
26aa0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
26ab0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
26ac0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26ad0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
26ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26af0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26b00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26b10 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
26b20 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
26b30 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26b40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26b50 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
26b60 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
26b70 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
26b80 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
26b90 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
26ba0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
26bb0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
26bc0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
26bd0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
26be0 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
26bf0 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
26c00 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
26c10 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
26c20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
26c30 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
26c40 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
26c50 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
26c60 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
26c70 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
26c80 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
26c90 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
26ca0 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
26cb0 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
26cc0 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
26cd0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
26ce0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
26cf0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
26d00 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
26d10 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
26d20 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
26d30 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
26d40 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
26d50 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
26d60 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
26d70 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
26d80 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26d90 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
26da0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
26db0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
26dc0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
26dd0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
26de0 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
26df0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
26e00 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
26e10 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
26e20 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
26e30 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
26e40 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26e50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
26e60 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
26e70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26e80 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
26e90 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
26ea0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
26eb0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
26ec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26ed0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
26ee0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
26ef0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
26f00 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
26f10 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
26f20 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
26f30 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
26f40 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
26f50 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
26f60 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
26f70 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
26f80 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
26f90 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
26fa0 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
26fb0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
26fc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26fd0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
26fe0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
26ff0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27000 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
27010 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
27020 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
27030 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
27040 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27050 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
27060 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
27070 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
27080 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
27090 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
270a0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
270b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
270c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
270d0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
270e0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
270f0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
27100 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
27110 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27120 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
27130 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27140 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
27150 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
27160 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
27170 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
27180 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27190 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
271a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
271b0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
271c0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
271d0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
271e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
271f0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
27200 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
27210 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27220 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
27230 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27240 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
27250 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
27260 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
27270 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
27280 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
27290 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
272a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
272b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
272c0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
272d0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
272e0 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
272f0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
27300 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
27310 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
27320 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
27330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27340 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
27350 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
27360 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
27370 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27380 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
27390 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
273a0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
273b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
273c0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
273d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
273e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
273f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
27400 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
27410 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20  ault_expr: .    
27420 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
27430 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
27440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27450 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
27460 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
27470 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
27480 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
27490 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
274a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
274b0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
274c0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
274d0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
274e0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
274f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27500 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
27510 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
27520 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
27530 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
27540 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
27550 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
27560 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
27570 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
27580 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
27590 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
275a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
275b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
275c0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
275d0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
275e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
275f0 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
27600 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33  .** Like sqlite3
27610 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78  ExprIfFalse() ex
27620 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79  cept that a copy
27630 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70   is made of pExp
27640 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65  r before.** code
27650 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64   generation, and
27660 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65   that copy is de
27670 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65  leted after code
27680 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69   generation. Thi
27690 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61  s.** ensures tha
276a0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
276b0 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65  Expr is unchange
276c0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
276d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70  e3ExprIfFalseDup
276e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
276f0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
27700 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66   dest,int jumpIf
27710 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  Null){.  sqlite3
27720 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
27730 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79  b;.  Expr *pCopy
27740 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
27750 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
27760 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
27770 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
27780 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27790 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f  alse(pParse, pCo
277a0 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  py, dest, jumpIf
277b0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
277c0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
277d0 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 0a 2f  b, pCopy);.}.../
277e0 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
277f0 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
27800 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
27810 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
27820 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
27830 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c  ssions are compl
27840 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e  etely identical.
27850 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
27860 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a  ey differ only.*
27870 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f  * by a COLLATE o
27880 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74  perator at the t
27890 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72  op level.  Retur
278a0 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65  n 2 if there are
278b0 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20   differences.** 
278c0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74  other than the t
278d0 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45  op-level COLLATE
278e0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
278f0 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
27900 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
27910 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
27920 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
27930 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
27940 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
27950 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
27960 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
27970 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
27980 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d  ** The pA side m
27990 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b  ight be using TK
279a0 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74  _REGISTER.  If t
279b0 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20  hat is the case 
279c0 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74  and pB is.** not
279d0 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
279e0 45 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77  ER but is otherw
279f0 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20  ise equivalent, 
27a00 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
27a10 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  n 0..**.** Somet
27a20 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e  imes this routin
27a30 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20  e will return 2 
27a40 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20  even if the two 
27a50 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72  expressions.** r
27a60 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61  eally are equiva
27a70 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e  lent.  If we can
27a80 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74  not prove that t
27a90 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
27aa0 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c  re.** identical,
27ab0 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73   we return 2 jus
27ac0 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53  t to be safe.  S
27ad0 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
27ae0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20  e.** returns 2, 
27af0 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20  then you do not 
27b00 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20  really know for 
27b10 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74  certain if the t
27b20 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
27b30 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
27b40 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20   But if you get 
27b50 61 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c  a 0 or 1 return,
27b60 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e   then you.** can
27b70 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70   be sure the exp
27b80 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
27b90 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70   same.  In the p
27ba0 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74  laces where.** t
27bb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
27bc0 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  sed, it does not
27bd0 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20   hurt to get an 
27be0 65 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a  extra 2 - that.*
27bf0 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73  * just might res
27c00 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67  ult in some slig
27c10 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65  htly slower code
27c20 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67  .  But returning
27c30 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74  .** an incorrect
27c40 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65   0 or 1 could le
27c50 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74  ad to a malfunct
27c60 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
27c70 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45  te3ExprCompare(E
27c80 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
27c90 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
27ca0 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  u32 combinedFlag
27cb0 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  s;.  if( pA==0 |
27cc0 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  | pB==0 ){.    r
27cd0 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30  eturn pB==pA ? 0
27ce0 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62   : 2;.  }.  comb
27cf0 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e  inedFlags = pA->
27d00 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67  flags | pB->flag
27d10 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  s;.  if( combine
27d20 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  dFlags & EP_IntV
27d30 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20  alue ){.    if( 
27d40 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66  (pA->flags&pB->f
27d50 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65  lags&EP_IntValue
27d60 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56  )!=0 && pA->u.iV
27d70 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue==pB->u.iVal
27d80 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
27d90 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
27da0 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
27db0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
27dc0 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  op ){.    if( pA
27dd0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
27de0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
27df0 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
27e00 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b  , pB, iTab)<2 ){
27e10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
27e20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
27e30 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  B->op==TK_COLLAT
27e40 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  E && sqlite3Expr
27e50 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e  Compare(pA, pB->
27e60 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29  pLeft, iTab)<2 )
27e70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
27e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
27e90 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
27ea0 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
27eb0 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f  N && pA->op!=TK_
27ec0 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  AGG_COLUMN && pA
27ed0 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
27ee0 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
27ef0 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
27f00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
27f10 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  rICmp(pA->u.zTok
27f20 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
27f30 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  !=0 ) return 2;.
27f40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
27f50 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  rcmp(pA->u.zToke
27f60 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
27f70 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
27f80 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  rn pA->op==TK_CO
27f90 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20  LLATE ? 1 : 2;. 
27fa0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
27fb0 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
27fc0 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
27fd0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
27fe0 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
27ff0 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
28000 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
28010 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20  _TokenOnly)==0) 
28020 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69  ){.    if( combi
28030 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49  nedFlags & EP_xI
28040 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  sSelect ) return
28050 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
28060 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
28070 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
28080 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  eft, iTab) ) ret
28090 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
280a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
280b0 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  e(pA->pRight, pB
280c0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
280d0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
280e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
280f0 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
28100 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
28110 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ist, iTab) ) ret
28120 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41  urn 2;.    if( A
28130 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
28140 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
28150 64 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f 70  d)==0) && pA->op
28160 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  !=TK_STRING ){. 
28170 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f       if( pA->iCo
28180 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
28190 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  n ) return 2;.  
281a0 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62      if( pA->iTab
281b0 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a  le!=pB->iTable .
281c0 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69         && (pA->i
281d0 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e  Table!=iTab || N
281e0 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e  EVER(pB->iTable>
281f0 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b  =0)) ) return 2;
28200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28210 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
28220 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72  Compare two Expr
28230 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52  List objects.  R
28240 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20  eturn 0 if they 
28250 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
28260 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  d .** non-zero i
28270 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
28280 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
28290 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
282a0 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
282b0 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
282c0 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
282d0 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
282e0 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
282f0 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
28300 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
28310 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
28320 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
28330 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ight return non-
28340 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c  zero for equival
28350 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20  ent ExprLists.  
28360 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73  The.** only cons
28370 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20  equence will be 
28380 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a  disabled optimiz
28390 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69  ations.  But thi
283a0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73  s routine.** mus
283b0 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30  t never return 0
283c0 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72   if the two Expr
283d0 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65  List objects are
283e0 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a   different, or.*
283f0 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20  * a malfunction 
28400 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a  will result..**.
28410 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e  ** Two NULL poin
28420 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ters are conside
28430 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61  red to be the sa
28440 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20  me.  But a NULL 
28450 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79  pointer.** alway
28460 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61  s differs from a
28470 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65   non-NULL pointe
28480 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
28490 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
284a0 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45  (ExprList *pA, E
284b0 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74  xprList *pB, int
284c0 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b   iTab){.  int i;
284d0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20  .  if( pA==0 && 
284e0 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pB==0 ) return 0
284f0 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
28500 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
28510 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78  1;.  if( pA->nEx
28520 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20  pr!=pB->nExpr ) 
28530 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28  return 1;.  for(
28540 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72  i=0; i<pA->nExpr
28550 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
28560 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61   *pExprA = pA->a
28570 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45  [i].pExpr;.    E
28580 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42  xpr *pExprB = pB
28590 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
285a0 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73    if( pA->a[i].s
285b0 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b  ortOrder!=pB->a[
285c0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72  i].sortOrder ) r
285d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
285e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
285f0 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70  are(pExprA, pExp
28600 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  rB, iTab) ) retu
28610 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
28620 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
28630 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
28640 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74 20  ompare() except 
28650 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
28660 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  s at the top-lev
28670 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65  el.** are ignore
28680 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
28690 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70  3ExprCompareSkip
286a0 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
286b0 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
286c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
286d0 45 78 70 72 43 6f 6d 70 61 72 65 28 0a 20 20 20  ExprCompare(.   
286e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
286f0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
28700 28 70 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20  (pA),.          
28710 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b     sqlite3ExprSk
28720 69 70 43 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20  ipCollate(pB),. 
28730 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
28740 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
28750 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 63 61  rn true if we ca
28760 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45 32 20  n prove the pE2 
28770 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74  will always be t
28780 72 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a  rue if pE1 is.**
28790 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66   true.  Return f
287a0 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  alse if we canno
287b0 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70  t complete the p
287c0 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d  roof or if pE2 m
287d0 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65  ight.** be false
287e0 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
287f0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35  **     pE1: x==5
28800 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
28820 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
28830 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20   pE1: x>0       
28840 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
28850 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66         Result: f
28860 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  alse.**     pE1:
28870 20 78 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a   x=21       pE2:
28880 20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20   x=21 OR y=43   
28890 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
288a0 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32  *     pE1: x!=12
288b0 33 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20  3     pE2: x IS 
288c0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
288d0 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
288e0 70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20  pE1: x!=?1      
288f0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
28900 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
28910 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
28920 20 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78   IS NULL  pE2: x
28930 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
28940 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
28950 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f       pE1: x IS ?
28960 32 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e  2    pE2: x IS N
28970 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c  OT NULL    Reusl
28980 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57  t: false.**.** W
28990 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b  hen comparing TK
289a0 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65  _COLUMN nodes be
289b0 74 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45  tween pE1 and pE
289c0 32 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a  2, if pE2 has.**
289d0 20 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74   Expr.iTable<0 t
289e0 68 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62  hen assume a tab
289f0 6c 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20  le number given 
28a00 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57  by iTab..**.** W
28a10 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
28a20 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74  turn false.  Ret
28a30 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68  urning true migh
28a40 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
28a50 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d  ance.** improvem
28a60 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
28a70 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73  false might caus
28a80 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
28a90 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  reduction, but.*
28aa0 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  * it will always
28ab0 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63   give the correc
28ac0 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20  t answer and is 
28ad0 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66  hence always saf
28ae0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
28af0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
28b00 28 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72  (Expr *pE1, Expr
28b10 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29   *pE2, int iTab)
28b20 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  {.  if( sqlite3E
28b30 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20  xprCompare(pE1, 
28b40 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b  pE2, iTab)==0 ){
28b50 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
28b60 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70   }.  if( pE2->op
28b70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73  ==TK_OR.   && (s
28b80 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
28b90 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e  sExpr(pE1, pE2->
28ba0 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20  pLeft, iTab).   
28bb0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
28bc0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
28bd0 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52  xpr(pE1, pE2->pR
28be0 69 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20  ight, iTab) ).  
28bf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
28c00 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e  .  }.  if( pE2->
28c10 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26  op==TK_NOTNULL &
28c20 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
28c30 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21  NULL && pE1->op!
28c40 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20 45 78  =TK_IS ){.    Ex
28c50 70 72 20 2a 70 58 20 3d 20 73 71 6c 69 74 65 33  pr *pX = sqlite3
28c60 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
28c70 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  pE1->pLeft);.   
28c80 20 74 65 73 74 63 61 73 65 28 20 70 58 21 3d 70   testcase( pX!=p
28c90 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  E1->pLeft );.   
28ca0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
28cb0 43 6f 6d 70 61 72 65 28 70 58 2c 20 70 45 32 2d  Compare(pX, pE2-
28cc0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30  >pLeft, iTab)==0
28cd0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
28ce0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28cf0 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
28d00 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
28d10 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
28d20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
28d30 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65   walker.** to de
28d40 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78  termine if an ex
28d50 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
28d60 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65 66  evaluated by ref
28d70 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a  erence to the.**
28d80 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74   index only, wit
28d90 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64  hout having to d
28da0 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74  o a search for t
28db0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
28dc0 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  .** table entry.
28dd0 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70    The IdxCover.p
28de0 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68 65  Idx field is the
28df0 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65   index.  IdxCove
28e00 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65  r.iCur.** is the
28e10 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
28e20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  table..*/.struct
28e30 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e   IdxCover {.  In
28e40 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f  dex *pIdx;     /
28e50 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
28e60 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76  e tested for cov
28e70 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  erage */.  int i
28e80 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur;        /* C
28e90 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
28ea0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65   the table corre
28eb0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
28ec0 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  index */.};../*.
28ed0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
28ee0 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65 66  if there are ref
28ef0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
28f00 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20  ns in table .** 
28f10 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
28f20 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62  over->iCur can b
28f30 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  e satisfied usin
28f40 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70  g the index.** p
28f50 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
28f60 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74  ver->pIdx..*/.st
28f70 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64 78  atic int exprIdx
28f80 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  Cover(Walker *pW
28f90 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
28fa0 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
28fb0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
28fc0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
28fd0 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
28fe0 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a  pIdxCover->iCur.
28ff0 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c     && sqlite3Col
29000 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b  umnOfIndex(pWalk
29010 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
29020 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43  >pIdx, pExpr->iC
29030 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20  olumn)<0.  ){.  
29040 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
29050 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
29060 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
29070 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
29080 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
29090 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  Determine if an 
290a0 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61  index pIdx on ta
290b0 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
290c0 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69  iCur contains wi
290d0 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ll.** the expres
290e0 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74  sion pExpr.  Ret
290f0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
29100 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72  index does cover
29110 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
29120 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  on and false if 
29130 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
29140 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20  sion references 
29150 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  table columns.**
29160 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f   that are not fo
29170 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78  und in the index
29180 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   pIdx..**.** An 
29190 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61  index covering a
291a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61  n expression mea
291b0 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ns that the expr
291c0 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a  ession can be.**
291d0 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67   evaluated using
291e0 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20   only the index 
291f0 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76 69  and without havi
29200 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ng to lookup the
29210 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
29220 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a  g table entry..*
29230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
29240 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28  rCoveredByIndex(
29250 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
29260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
29270 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
29280 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
29290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
292a0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
292b0 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
292c0 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ding table */.  
292d0 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
292e0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
292f0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 75   that might be u
29300 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  sed for coverage
29310 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20   */.){.  Walker 
29320 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78 43  w;.  struct IdxC
29330 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d  over xcov;.  mem
29340 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
29350 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43  f(w));.  xcov.iC
29360 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f  ur = iCur;.  xco
29370 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  v.pIdx = pIdx;. 
29380 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
29390 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b   = exprIdxCover;
293a0 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72  .  w.u.pIdxCover
293b0 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69   = &xcov;.  sqli
293c0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
293d0 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e  pExpr);.  return
293e0 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f   !w.eCode;.}.../
293f0 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
29400 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
29410 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
29420 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
29430 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75  walker.** to cou
29440 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  nt references to
29450 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69   table columns i
29460 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
29470 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67  of an .** aggreg
29480 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e  ate function, in
29490 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
294a0 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ent the.** sqlit
294b0 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72  e3FunctionThisSr
294c0 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  c() routine..*/.
294d0 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
294e0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
294f0 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74  c;   /* One part
29500 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75  icular FROM clau
29510 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71  se in a nested q
29520 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  uery */.  int nT
29530 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  his;       /* Nu
29540 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
29550 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
29560 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69   pSrcList */.  i
29570 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20  nt nOther;      
29580 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
29590 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
295a0 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d  ns in other FROM
295b0 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a   clauses */.};..
295c0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
295d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
295e0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e  nces to columns.
295f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
29600 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b  xprSrcCount(Walk
29610 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
29620 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
29630 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74  The NEVER() on t
29640 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69  he second term i
29650 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65  s because sqlite
29660 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
29670 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61  sSrc().  ** is a
29680 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66  lways called bef
29690 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  ore sqlite3ExprA
296a0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
296b0 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20  () and so the.  
296c0 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61  ** TK_COLUMNs ha
296d0 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
296e0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
296f0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49  K_AGG_COLUMN.  I
29700 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75  f.  ** sqlite3Fu
29710 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
29720 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66  c() is used diff
29730 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66  erently in the f
29740 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20  uture, the.  ** 
29750 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65  NEVER() will nee
29760 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e  d to be removed.
29770 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
29780 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
29790 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f  | NEVER(pExpr->o
297a0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
297b0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
297c0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f      struct SrcCo
297d0 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  unt *p = pWalker
297e0 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20  ->u.pSrcCount;. 
297f0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
29800 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
29810 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20  int nSrc = pSrc 
29820 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30  ? pSrc->nSrc : 0
29830 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
29840 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
29850 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
29860 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d  able==pSrc->a[i]
29870 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
29880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29890 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  i<nSrc ){.      
298a0 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20  p->nThis++;.    
298b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
298c0 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a  nOther++;.    }.
298d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
298e0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
298f0 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
29900 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75   any of the argu
29910 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78  ments to the pEx
29920 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65  pr Function refe
29930 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73  rence.** pSrcLis
29940 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
29950 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73  if they do.  Als
29960 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  o return true if
29970 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   the function.**
29980 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74   has no argument
29990 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f  s or has only co
299a0 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
299b0 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
299c0 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65  if pExpr.** refe
299d0 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62  rences columns b
299e0 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f  ut not columns o
299f0 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69  f tables found i
29a00 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69  n pSrcList..*/.i
29a10 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  nt sqlite3Functi
29a20 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78  onUsesThisSrc(Ex
29a30 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69  pr *pExpr, SrcLi
29a40 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20  st *pSrcList){. 
29a50 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
29a60 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74  uct SrcCount cnt
29a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
29a80 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
29a90 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73  NCTION );.  mems
29aa0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
29ab0 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
29ac0 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72  allback = exprSr
29ad0 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53  cCount;.  w.u.pS
29ae0 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a  rcCount = &cnt;.
29af0 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72    cnt.pSrc = pSr
29b00 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68  cList;.  cnt.nTh
29b10 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f  is = 0;.  cnt.nO
29b20 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ther = 0;.  sqli
29b30 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
29b40 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  &w, pExpr->x.pLi
29b50 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e  st);.  return cn
29b60 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74  t.nThis>0 || cnt
29b70 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f  .nOther==0;.}../
29b80 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
29b90 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
29ba0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
29bb0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
29bc0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
29bd0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
29be0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
29bf0 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
29c00 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
29c10 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
29c20 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  foColumn(sqlite3
29c30 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
29c40 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
29c50 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20    pInfo->aCol = 
29c60 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
29c70 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
29c80 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
29c90 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  Col,.       size
29ca0 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30  of(pInfo->aCol[0
29cb0 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
29cc0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  o->nColumn,.    
29cd0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
29ce0 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
29cf0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
29d00 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
29d10 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
29d20 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
29d30 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
29d40 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
29d50 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
29d60 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
29d70 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
29d80 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
29d90 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
29da0 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
29db0 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
29dc0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
29dd0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
29de0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
29df0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
29e00 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
29e10 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
29e20 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
29e30 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
29e40 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
29e50 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
29e60 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
29e70 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f  xExprCallback fo
29e80 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e  r a tree walker.
29e90 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a    It is used to.
29ea0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  ** implement sql
29eb0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
29ec0 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
29ed0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
29ee0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
29ef0 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
29f00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
29f10 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
29f20 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c  yzeAggregate(Wal
29f30 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
29f40 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
29f50 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
29f60 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65  xt *pNC = pWalke
29f70 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73  r->u.pNC;.  Pars
29f80 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
29f90 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
29fa0 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
29fb0 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
29fc0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
29fd0 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  o = pNC->pAggInf
29fe0 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  o;..  switch( pE
29ff0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
2a000 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
2a010 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
2a020 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74  OLUMN: {.      t
2a030 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2a040 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2a050 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
2a060 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2a070 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
2a080 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2a090 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ee if the column
2a0a0 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68   is in one of th
2a0b0 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2a0c0 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c  FROM.      ** cl
2a0d0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
2a0e0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
2a0f0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
2a100 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a  pSrcList!=0) ){.
2a110 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
2a120 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2a130 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
2a140 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2a150 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
2a160 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
2a170 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
2a180 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2a190 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
2a1a0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2a1b0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2a1c0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2a1d0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2a1e0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2a1f0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
2a200 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
2a210 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2a220 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
2a230 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
2a240 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
2a250 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
2a260 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
2a270 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2a280 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2a290 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
2a2a0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2a2b0 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
2a2c0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
2a2d0 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
2a2e0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
2a2f0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
2a300 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
2a310 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
2a320 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
2a330 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2a340 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
2a350 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
2a360 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
2a370 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
2a380 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2a390 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
2a3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2a3b0 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
2a3c0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
2a3d0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
2a3e0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
2a3f0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
2a400 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2a410 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a440 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
2a450 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
2a460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2a470 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
2a480 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
2a490 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
2a4a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
2a4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2a4c0 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
2a4d0 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
2a4e0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
2a4f0 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
2a500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a510 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
2a520 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
2a530 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2a540 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
2a550 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
2a560 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2a570 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
2a580 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
2a590 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2a5a0 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2a5c0 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
2a5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a5e0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
2a5f0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2a600 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
2a610 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
2a620 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
2a630 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
2a640 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
2a650 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
2a660 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
2a670 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
2a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
2a690 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
2a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2a6b0 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
2a6c0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2a6e0 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
2a6f0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2a700 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
2a710 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
2a720 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
2a730 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
2a760 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
2a770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a780 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2a790 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2a7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2a7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2a800 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
2a810 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
2a820 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2a830 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2a840 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
2a850 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
2a860 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a870 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a880 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
2a890 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
2a8a0 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
2a8b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
2a8c0 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
2a8d0 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
2a8e0 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
2a8f0 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
2a900 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
2a910 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2a920 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
2a930 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
2a940 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
2a950 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
2a960 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
2a970 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
2a980 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2a990 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
2a9a0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2a9b0 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
2a9c0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
2a9d0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
2a9e0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
2a9f0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2aa00 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
2aa10 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
2aa20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
2aa30 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  16)k;.          
2aa40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2aa50 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
2aa60 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
2aa70 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
2aa80 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
2aa90 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
2aaa0 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
2aab0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2aac0 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
2aad0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
2aae0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  TION: {.      if
2aaf0 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
2ab00 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d  & NC_InAggFunc)=
2ab10 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61  =0.       && pWa
2ab20 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74  lker->walkerDept
2ab30 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20  h==pExpr->op2.  
2ab40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
2ab50 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2ab60 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70  f pExpr is a dup
2ab70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
2ab80 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20  r aggregate .   
2ab90 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2aba0 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
2abb0 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f   in the pAggInfo
2abc0 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20   structure.     
2abd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
2abe0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2abf0 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49  c *pItem = pAggI
2ac00 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20  nfo->aFunc;.    
2ac10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2ac20 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2ac30 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2ac40 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2ac50 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2ac60 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
2ac70 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  xpr, -1)==0 ){. 
2ac80 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2ac90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2aca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2acb0 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
2acc0 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
2acd0 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
2ace0 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
2acf0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2ad00 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2ad10 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2ad20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
2ad30 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
2ad40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
2ad50 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
2ad60 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2ad70 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2ad80 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
2ad90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ada0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2adb0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
2adc0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
2add0 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
2ade0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2adf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2ae00 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
2ae10 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2ae20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
2ae30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ae40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ae50 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2ae60 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
2ae70 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
2ae80 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
2ae90 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
2aea0 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
2aeb0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2aec0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
2aed0 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20  .zToken, .      
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2aef0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
2af00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2af10 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
2af20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2af30 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
2af40 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2af60 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2af70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2af80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2af90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2afa0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2afb0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
2afc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2afd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2afe0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
2aff0 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
2b000 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
2b010 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
2b020 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
2b030 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2b040 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2b050 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
2b060 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2b070 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
2b080 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2b090 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
2b0a0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
2b0b0 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
2b0c0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2b0d0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2b0e0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
2b0f0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2b100 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b110 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2b120 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2b130 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2b140 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2b150 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
2b160 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2b170 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
2b180 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2b190 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2b1a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b1b0 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45  Walker);.  UNUSE
2b1c0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
2b1d0 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ect);.  return W
2b1e0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2b1f0 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
2b200 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2b210 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
2b220 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2b230 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
2b240 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
2b250 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
2b260 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2b270 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
2b280 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
2b290 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
2b2a0 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
2b2b0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
2b2c0 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
2b2d0 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
2b2e0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
2b2f0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
2b300 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
2b310 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
2b320 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
2b330 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
2b340 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
2b350 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2b360 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
2b370 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
2b380 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
2b390 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
2b3a0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
2b3b0 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
2b3c0 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
2b3d0 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
2b3e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
2b3f0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2b400 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e  InSelect;.  w.u.
2b410 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73  pNC = pNC;.  ass
2b420 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
2b430 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
2b440 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2b450 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
2b460 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
2b470 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2b480 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
2b490 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
2b4a0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
2b4b0 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
2b4c0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
2b4d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2b4e0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
2b4f0 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
2b500 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
2b510 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2b520 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
2b530 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2b540 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2b550 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2b560 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
2b570 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
2b580 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
2b590 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
2b5a0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
2b5b0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2b5c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2b5d0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2b5e0 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
2b5f0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2b600 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
2b610 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
2b620 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
2b630 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
2b640 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2b650 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
2b660 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
2b670 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
2b680 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
2b690 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
2b6a0 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
2b6b0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
2b6c0 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
2b6d0 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
2b6e0 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
2b6f0 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
2b700 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
2b710 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
2b720 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
2b730 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a  r.** purpose..**
2b740 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
2b750 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62  r is currently b
2b760 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65  eing used by the
2b770 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74   column cache, t
2b780 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c  hen.** the deall
2b790 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72  ocation is defer
2b7a0 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  red until the co
2b7b0 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20  lumn cache line 
2b7c0 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65  that uses.** the
2b7d0 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65   register become
2b7e0 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  s stale..*/.void
2b7f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2b800 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
2b810 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
2b820 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
2b830 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
2b840 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
2b850 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
2b860 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
2b870 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
2b880 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  p;.    for(i=0, 
2b890 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
2b8a0 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
2b8b0 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
2b8c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2b8d0 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
2b8e0 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52          p->tempR
2b8f0 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  eg = 1;.        
2b900 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
2b910 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
2b920 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
2b930 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
2b940 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
2b950 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
2b960 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
2b970 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
2b980 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
2b990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b9a0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
2b9b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2b9c0 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
2b9d0 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31  n;.  if( nReg==1
2b9e0 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65   ) return sqlite
2b9f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2ba00 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73  se);.  i = pPars
2ba10 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->iRangeReg;.  
2ba20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  n = pParse->nRan
2ba30 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65  geReg;.  if( nRe
2ba40 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  g<=n ){.    asse
2ba50 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d  rt( !usedAsColum
2ba60 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
2ba70 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20  , i+n-1) );.    
2ba80 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2ba90 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  g += nReg;.    p
2baa0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2bab0 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73   -= nReg;.  }els
2bac0 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73  e{.    i = pPars
2bad0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
2bae0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
2baf0 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Reg;.  }.  retur
2bb00 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  n i;.}.void sqli
2bb10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2bb20 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2bb30 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
2bb40 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52   nReg){.  if( nR
2bb50 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  eg==1 ){.    sql
2bb60 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2bb70 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 67 29  eg(pParse, iReg)
2bb80 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2bb90 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
2bba0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
2bbb0 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a  e, iReg, nReg);.
2bbc0 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
2bbd0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
2bbe0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2bbf0 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
2bc00 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2bc10 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
2bc20 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c  }../*.** Mark al
2bc30 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  l temporary regi
2bc40 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75  sters as being u
2bc50 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72  navailable for r
2bc60 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  euse..*/.void sq
2bc70 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
2bc80 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  gCache(Parse *pP
2bc90 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
2bca0 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
2bcb0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2bcc0 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg = 0;.}../*.**
2bcd0 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e   Validate that n
2bce0 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  o temporary regi
2bcf0 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69  ster falls withi
2bd00 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a  n the range of.*
2bd10 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c  * iFirst..iLast,
2bd20 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69   inclusive.  Thi
2bd30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
2bd40 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68  y call from with
2bd50 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  in assert().** s
2bd60 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69  tatements..*/.#i
2bd70 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2bd80 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54  G.int sqlite3NoT
2bd90 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73  empsInRange(Pars
2bda0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2bdb0 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74  First, int iLast
2bdc0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
2bdd0 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  ( pParse->nRange
2bde0 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72  Reg>0.   && pPar
2bdf0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50  se->iRangeReg+pP
2be00 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3c  arse->nRangeReg<
2be10 69 4c 61 73 74 0a 20 20 20 26 26 20 70 50 61 72  iLast.   && pPar
2be20 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3e 3d 69  se->iRangeReg>=i
2be30 46 69 72 73 74 0a 20 20 29 7b 0a 20 20 20 20 20  First.  ){.     
2be40 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2be50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
2be60 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b  e->nTempReg; i++
2be70 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
2be80 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d  e->aTempReg[i]>=
2be90 69 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65  iFirst && pParse
2bea0 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69  ->aTempReg[i]<=i
2beb0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
2bec0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
2bed0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2bee0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2bef0 5f 44 45 42 55 47 20 2a 2f 0a                    _DEBUG */.