/ Hex Artifact Content
Login

Artifact c2be1c1ae369dc14ba9e76831466b3a494986872:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
07c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
07d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
07e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61  return sqlite3Ta
07f0: 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
0800: 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  y(pExpr->pTab, p
0810: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0820: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0830: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0850: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
0860: 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  s&EP_xIsSelect )
0870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
0880: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0890: 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  (.        pExpr-
08a0: 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63  >pLeft->x.pSelec
08b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
08c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
08d0: 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  pr.    );.  }.  
08e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
08f0: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0900: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0910: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0920: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0930: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0940: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
0950: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
0960: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
0970: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
0980: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
0990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
09a0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
09b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
09c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
09d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
09e0: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
09f0: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0a00: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0a20: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0a30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0a40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0a50: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  Token(.  Parse *
0a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0a70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
0a80: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
0a90: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
0aa0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43     /* Add the "C
0ab0: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74  OLLATE" clause t
0ac0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
0ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  n */.  const Tok
0ae0: 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20  en *pCollName,  
0af0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
0b00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
0b10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b30: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 70  rue to dequote p
0b40: 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  CollName */.){. 
0b50: 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e   if( pCollName->
0b60: 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  n>0 ){.    Expr 
0b70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
0b80: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
0b90: 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c  >db, TK_COLLATE,
0ba0: 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75   pCollName, dequ
0bb0: 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ote);.    if( pN
0bc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0bd0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0be0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0bf0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0c00: 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20  |EP_Skip;.      
0c10: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
0c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0c30: 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a   pExpr;.}.Expr *
0c40: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0c50: 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72 73  llateString(Pars
0c60: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0c70: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
0c80: 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e  ar *zC){.  Token
0c90: 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   s;.  assert( zC
0ca0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
0cb0: 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28 63  TokenInit(&s, (c
0cc0: 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75  har*)zC);.  retu
0cd0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 64  rn sqlite3ExprAd
0ce0: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0cf0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 2c  arse, pExpr, &s,
0d00: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b   0);.}../*.** Sk
0d10: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0d20: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
0d30: 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c   and any unlikel
0d40: 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69  y().** or likeli
0d50: 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  hood() function 
0d60: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  at the root of a
0d70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  n expression..*/
0d80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78  prSkipCollate(Ex
0da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68  pr *pExpr){.  wh
0db0: 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78  ile( pExpr && Ex
0dc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0dd0: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0de0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e30: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0e40: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0e50: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0e60: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0e80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0e90: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0ea0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0ed0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0ef0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
0f00: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0f10: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
0f20: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0f30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0f50: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0f60: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0f70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0f80: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0f90: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0fa0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0fb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0fc0: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0fe0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0ff0: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
1000: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
1010: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
1020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1030: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
1040: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
1050: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
1060: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
1070: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
1080: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
1090: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
10a0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
10b0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10d0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
10e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1100: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
1110: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
1120: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( p ){.    int o
1130: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69  p = p->op;.    i
1140: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1150: 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b  _Generic ) break
1160: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ;.    if( op==TK
1170: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1180: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1190: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
11a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
11c0: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
11d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
11e0: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
11f0: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1220: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1230: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1250: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
1260: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1270: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1280: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1290: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
12a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26  TRIGGER).     &&
12b0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
12c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
12d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
12e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
12f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1300: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1310: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1320: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1330: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1340: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
1360: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1370: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1390: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
13a0: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
13b0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13e0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1420: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1430: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1440: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
1450: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1460: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1470: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1490: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
14a0: 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b  xt  = p->pRight;
14b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
14c0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
14d0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
14e0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
14f0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
1500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1510: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1520: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1530: 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61         /* p->fla
1540: 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c  gs holds EP_Coll
1550: 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74  ate and p->pLeft
1560: 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74  ->flags does not
1570: 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a  .  And.        *
1580: 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63  * p->x.pSelect c
1590: 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d  annot.  So if p-
15a0: 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c  >x.pLeft exists,
15b0: 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74   it must hold at
15c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73  .        ** leas
15d0: 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65  t one EP_Collate
15e0: 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f  . Thus the follo
15f0: 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e  wing two ALWAYS.
1600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1610: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
1620: 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61 73   ALWAYS(!ExprHas
1630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
1640: 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20  IsSelect)) ){.  
1650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1660: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1670: 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e  ; ALWAYS(i<p->x.
1680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69  pList->nExpr); i
1690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16b0: 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  erty(p->x.pList-
16c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[i].pExpr, EP_
16d0: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
16e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20            pNext 
16f0: 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  = p->x.pList->a[
1700: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1740: 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70   }.        p = p
1750: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1790: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
17a0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
17b0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
17c0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
17e0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
17f0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1800: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1810: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1820: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1830: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1850: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1860: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1870: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1880: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1890: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
18a0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
18b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
18c0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
18d0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
18e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
18f0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1900: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1910: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1920: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1930: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1940: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1950: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1960: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1970: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1980: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
19a0: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
19b0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
19c0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
19d0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
19e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1a20: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1a30: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1a40: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1a50: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1a60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1a70: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1a80: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1a90: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1aa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1ac0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ad0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ae0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1af0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1b00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1b10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1b20: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1b30: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1b40: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1b50: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1b60: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1b70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1b80: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1b90: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1ba0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1bb0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1bc0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1bd0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1be0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1bf0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1c00: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
1c10: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1c20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1c30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1c40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1c50: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1c60: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1c70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1c80: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1c90: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1ca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
1cd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
1ce0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1cf0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
1d00: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
1d10: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1d30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d40: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1d50: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1d60: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d70: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1d80: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1d90: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1da0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1db0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1dc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1dd0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1de0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1df0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1e00: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
1e10: 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 61 66  lse if( NEVER(af
1e20: 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 61 66 66  f==0) ){.    aff
1e30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
1e40: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
1e50: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
1e60: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
1e70: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
1e80: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
1e90: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1ea0: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1eb0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1ec0: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1ed0: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1ee0: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1ef0: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1f00: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1f10: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1f20: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1f30: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
1f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
1f50: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
1f60: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
1f70: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
1f80: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
1f90: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1fa0: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1fb0: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1fc0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ff0: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
2000: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
2010: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
2020: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
2030: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2040: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
2050: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
2060: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
2070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2080: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
2090: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
20a0: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
20b0: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
20c0: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
20d0: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
20e0: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
20f0: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
2100: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
2110: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
2120: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
2130: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
2140: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
2150: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
2160: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
2170: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
2180: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
2190: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
21a0: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
21b0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
21c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
21e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
21f0: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2200: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
2210: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
2220: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
2230: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
2240: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
2250: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
2260: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
2270: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2280: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
2290: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
22a0: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
22b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
22c0: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
22d0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
22e0: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
22f0: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
2300: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
2310: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
2320: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
2330: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
2340: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
2350: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
2360: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
2370: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
2380: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
2390: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
23a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
23b0: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
23c0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
23d0: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
23e0: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
23f0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
2400: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
2410: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
2420: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2430: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
2440: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2450: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2460: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
2470: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
2480: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2490: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
24a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
24b0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
24c0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
24e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2500: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
2510: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
2520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2530: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2540: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
2550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
2560: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
2570: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
2580: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
2590: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
25a0: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
25b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
25d0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
25e0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
25f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2600: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2610: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2620: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2630: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2640: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2650: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2660: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2670: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2680: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2690: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
26a0: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
26b0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
26c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
26d0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
26e0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
26f0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2700: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2710: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2720: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2730: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2740: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2750: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2760: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2770: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2780: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2790: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
27a0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
27b0: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
27c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27e0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
27f0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2820: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2830: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2840: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2850: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
2860: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
2870: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2880: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2890: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 6f 72   is a vector, or
28a0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
28b0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72  ..**.** A vector
28c0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 61   is defined as a
28d0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
28e0: 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20 74 77  at results in tw
28f0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c  o or more.** col
2900: 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74 2e 20  umns of result. 
2910: 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54 4f 52   Every TK_VECTOR
2920: 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65 63 74   node is an vect
2930: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  or because the.*
2940: 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f  * parser will no
2950: 74 20 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f  t generate a TK_
2960: 56 45 43 54 4f 52 20 77 69 74 68 20 66 65 77 65  VECTOR with fewe
2970: 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74 72 69  r than two entri
2980: 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f  es..** But a TK_
2990: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62 65 20  SELECT might be 
29a0: 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
29b0: 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49 74 20  or a scalar. It 
29c0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69  is only.** consi
29d0: 64 65 72 65 64 20 61 20 76 65 63 74 6f 72 20 69  dered a vector i
29e0: 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f 72 20  f it has two or 
29f0: 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  more result colu
2a00: 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mns..*/.int sqli
2a10: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
2a20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2a40: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
2a50: 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pr)>1;.}../*.** 
2a60: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
2a70: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
2a80: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
2a90: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
2aa0: 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  OR .** return th
2ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72  e number of expr
2ac0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 76  essions in the v
2ad0: 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68  ector. Or, if th
2ae0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
2af0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
2b00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2b10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2b20: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
2b30: 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65   For.** any othe
2b40: 72 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  r type of expres
2b50: 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a  sion, return 1..
2b60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45 78 70  prVectorSize(Exp
2b80: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 38 20  r *pExpr){.  u8 
2b90: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
2ba0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
2bb0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78  ISTER ) op = pEx
2bc0: 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f  pr->op2;.  if( o
2bd0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a  p==TK_VECTOR ){.
2be0: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
2bf0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2c00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c10: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2c20: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
2c30: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2c40: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c50: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
2c60: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
2c70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2c80: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75  QUERY./*.** Retu
2c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2ca0: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  a subexpression 
2cb0: 6f 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20  of pVector that 
2cc0: 69 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63  is the i-th.** c
2cd0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
2ce0: 74 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74  tor (numbered st
2cf0: 61 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20  arting with 0). 
2d00: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2d10: 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20  .** ensure that 
2d20: 69 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67  i is within rang
2d30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  e..**.** If pVec
2d40: 74 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tor is really a 
2d50: 73 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61  scalar (and "sca
2d60: 6c 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64  lar" here includ
2d70: 65 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  es subqueries.**
2d80: 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73   that return a s
2d90: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74  ingle column!) t
2da0: 68 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74  hen return pVect
2db0: 6f 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  or unmodified..*
2dc0: 2a 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74  *.** pVector ret
2dd0: 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f  ains ownership o
2de0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  f the returned s
2df0: 75 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  ubexpression..**
2e00: 0a 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f  .** If the vecto
2e10: 72 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e  r is a (SELECT .
2e20: 2e 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70  ..) then the exp
2e30: 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
2e40: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20   is.** just the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  expression for t
2e60: 68 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20  he i-th term of 
2e70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
2e80: 61 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62  and may.** not b
2e90: 65 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c  e ready for eval
2ea0: 75 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74  uation because t
2eb0: 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
2ec0: 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62  has not yet.** b
2ed0: 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a  een positioned..
2ee0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2ef0: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
2f00: 70 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  pr(Expr *pVector
2f10: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2f20: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2f30: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2f40: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2f50: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2f60: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2f70: 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f    assert( pVecto
2f80: 72 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65  r->op2==0 || pVe
2f90: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ctor->op==TK_REG
2fa0: 49 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28  ISTER );.    if(
2fb0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
2fc0: 5f 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74  _SELECT || pVect
2fd0: 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45  or->op2==TK_SELE
2fe0: 43 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  CT ){.      retu
2ff0: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53  rn pVector->x.pS
3000: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
3010: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
3020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
3030: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c  rn pVector->x.pL
3040: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
3050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3060: 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 23  urn pVector;.}.#
3070: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
3080: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
3090: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 23 69 66 6e  BQUERY) */..#ifn
30a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30b0: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 43  SUBQUERY./*.** C
30c0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
30d0: 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f 62 6a  n a new Expr obj
30e0: 65 63 74 20 77 68 69 63 68 20 77 68 65 6e 20 70  ect which when p
30f0: 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69  assed to.** sqli
3100: 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 77 69  te3ExprCode() wi
3110: 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c 6c 20  ll generate all 
3120: 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65 20 74  necessary code t
3130: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
3140: 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d   iField-th colum
3150: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
3160: 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65 63 74  expression pVect
3170: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  or..**.** It is 
3180: 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72 20 74  ok for pVector t
3190: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 28 61  o be a scalar (a
31a0: 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65 6c 64  s long as iField
31b0: 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68  ==0).  .** In th
31c0: 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  at case, this ro
31d0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
31e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
31f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
3200: 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72 65 74  ler owns the ret
3210: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3220: 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f 6e 73  t and is respons
3230: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75  ible for.** ensu
3240: 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ring that the re
3250: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65 76 65  turned value eve
3260: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
3270: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ed..**.** The ca
3280: 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f 77 6e  ller retains own
3290: 65 72 73 68 69 70 20 6f 66 20 70 56 65 63 74 6f  ership of pVecto
32a0: 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  r.  If pVector i
32b0: 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a  s a TK_SELECT,.*
32c0: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
32d0: 6e 65 64 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ned object will 
32e0: 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74 6f  reference pVecto
32f0: 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f 72  r and so pVector
3300: 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20   must remain.** 
3310: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c 69  valid for the li
3320: 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  fe of the return
3330: 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 70  ed object.  If p
3340: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 56  Vector is a TK_V
3350: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63  ECTOR.** or a sc
3360: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  alar expression,
3370: 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65 20   then it can be 
3380: 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e 20  deleted as soon 
3390: 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  as this routine.
33a0: 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ** returns..**.*
33b0: 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61 75  * A trick to cau
33c0: 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 70  se a TK_SELECT p
33d0: 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65 6c  Vector to be del
33e0: 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  eted together wi
33f0: 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  th.** the return
3400: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 69  ed Expr object i
3410: 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20  s to attach the 
3420: 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20 70  pVector to the p
3430: 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f  Right field.** o
3440: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 54  f the returned T
3450: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3460: 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Expr object..*/.
3470: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3480: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28  rForVectorField(
3490: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
34a0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
34b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
34c0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20  Expr *pVector,  
34d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
34e0: 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78 70  or.  List of exp
34f0: 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
3500: 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e  b-SELECT */.  in
3510: 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20 20  t iField        
3520: 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75     /* Which colu
3530: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
3540: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b   to return */.){
3550: 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a 20  .  Expr *pRet;. 
3560: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3570: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
3580: 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74     assert( pVect
3590: 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  or->flags & EP_x
35a0: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
35b0: 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43 54  /* The TK_SELECT
35c0: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64  _COLUMN Expr nod
35d0: 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
35e0: 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20   pLeft:         
35f0: 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61 69    pVector contai
3600: 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 0a 20  ning TK_SELECT. 
3610: 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20 20     ** pRight:   
3620: 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64 2e         not used.
3630: 20 20 42 75 74 20 72 65 63 75 72 73 69 76 65 6c    But recursivel
3640: 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  y deleted..    *
3650: 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20 20  * iColumn:      
3660: 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63 6f     Index of a co
3670: 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72 0a  lumn in pVector.
3680: 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54      ** pLeft->iT
3690: 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e  able:   First in
36a0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
36b0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
36c0: 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a  sult, or 0.    *
36d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
36e0: 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c 74     if the result
36f0: 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70   is not yet comp
3700: 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
3710: 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   ** sqlite3ExprD
3720: 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69 63  elete() specific
3730: 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72  ally skips the r
3740: 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65 20  ecursive delete 
3750: 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20  of.    ** pLeft 
3760: 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  on TK_SELECT_COL
3770: 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20  UMN nodes.  But 
3780: 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77  pRight is follow
3790: 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20  ed, so pVector. 
37a0: 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74 74     ** can be att
37b0: 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74 20  ached to pRight 
37c0: 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e 6f  to cause this no
37d0: 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65 72  de to take owner
37e0: 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20 70  ship of.    ** p
37f0: 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61 6c  Vector.  Typical
3800: 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ly there will be
3810: 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c   multiple TK_SEL
3820: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
3830: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
3840: 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69 6e   same pLeft poin
3850: 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63 74  ter to the pVect
3860: 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65  or, but only one
3870: 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
3880: 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56 65  will own the pVe
3890: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
38a0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 50   pRet = sqlite3P
38b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
38c0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20 30  SELECT_COLUMN, 0
38d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 52  , 0);.    if( pR
38e0: 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74  et ){.      pRet
38f0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69 65  ->iColumn = iFie
3900: 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  ld;.      pRet->
3910: 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72 3b  pLeft = pVector;
3920: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
3930: 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70 52  t( pRet==0 || pR
3940: 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 3b  et->iTable==0 );
3950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3960: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3970: 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63 74  K_VECTOR ) pVect
3980: 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  or = pVector->x.
3990: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  pList->a[iField]
39a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65 74  .pExpr;.    pRet
39b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
39c0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56  p(pParse->db, pV
39d0: 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  ector, 0);.  }. 
39e0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
39f0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
3a00: 65 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  e(SQLITE_OMIT_SU
3a10: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a  BQUERY) */../*.*
3a20: 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20  * If expression 
3a30: 70 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65  pExpr is of type
3a40: 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65   TK_SELECT, gene
3a50: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
3a60: 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74  luate.** it. Ret
3a70: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
3a80: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3a90: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28  sult is stored (
3aa0: 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  or, if the .** s
3ab0: 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
3ac0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
3ad0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73  column, the firs
3ae0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a  t in an array.**
3af0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e   of registers in
3b00: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3b10: 74 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a  t is stored)..**
3b20: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
3b30: 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  not a TK_SELECT 
3b40: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
3b50: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
3b60: 69 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73  int exprCodeSubs
3b70: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
3b80: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
3b90: 29 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30  ){.  int reg = 0
3ba0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3bb0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3bc0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
3bd0: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
3be0: 20 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f   reg = sqlite3Co
3bf0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
3c00: 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
3c10: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
3c20: 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a  eturn reg;.}../*
3c30: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65  .** Argument pVe
3c40: 63 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ctor points to a
3c50: 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
3c60: 6f 6e 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b  on - either a TK
3c70: 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b  _VECTOR.** or TK
3c80: 5f 53 45 4c 45 43 54 20 74 68 61 74 20 72 65 74  _SELECT that ret
3c90: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ca0: 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20  ne column. This 
3cb0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
3cc0: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
3cd0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
3ce0: 69 73 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61  ister that conta
3cf0: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
3d00: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65  .** element iFie
3d10: 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  ld of the vector
3d20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
3d30: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
3d40: 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  T expression, th
3d50: 65 6e 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d  en code for it m
3d60: 75 73 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72  ust have .** alr
3d70: 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
3d80: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 65 78  ted using the ex
3d90: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
3da0: 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68  ) routine. In th
3db0: 69 73 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d  is.** case param
3dc0: 65 74 65 72 20 72 65 67 53 65 6c 65 63 74 20 73  eter regSelect s
3dd0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 66 69 72  hould be the fir
3de0: 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
3df0: 66 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63  f registers.** c
3e00: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
3e10: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62  sults of the sub
3e20: 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20  -select. .**.** 
3e30: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66  If pVector is of
3e40: 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c   type TK_VECTOR,
3e50: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74   then code for t
3e60: 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69 65  he requested fie
3e70: 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  ld.** is generat
3e80: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3e90: 20 28 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79   (*pRegFree) may
3ea0: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e   be set to the n
3eb0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65  umber of.** a te
3ec0: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
3ed0: 20 74 6f 20 62 65 20 66 72 65 65 64 20 62 79 20   to be freed by 
3ee0: 74 68 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72  the caller befor
3ef0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
3f00: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
3f10: 69 6e 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61  ing, output para
3f20: 6d 65 74 65 72 20 28 2a 70 70 45 78 70 72 29 20  meter (*ppExpr) 
3f30: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
3f40: 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f  to the.** Expr o
3f50: 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
3f60: 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69  ing to element i
3f70: 45 6c 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74  Elem of the vect
3f80: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
3f90: 74 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  t exprVectorRegi
3fa0: 73 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ster(.  Parse *p
3fb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
3fc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
3fd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
3fe0: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20  pr *pVector,    
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4000: 20 56 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61   Vector to extra
4010: 63 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20  ct element from 
4020: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c  */.  int iField,
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f       /* Field to
4050: 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56   extract from pV
4060: 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ector */.  int r
4070: 65 67 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  egSelect,       
4080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4090: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
40a0: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45  registers */.  E
40b0: 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20  xpr **ppExpr,   
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40d0: 2a 20 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f  * OUT: Expressio
40e0: 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  n element */.  i
40f0: 6e 74 20 2a 70 52 65 67 46 72 65 65 20 20 20 20  nt *pRegFree    
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4110: 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69  * OUT: Temp regi
4120: 73 74 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a  ster to free */.
4130: 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65  ){.  u8 op = pVe
4140: 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65  ctor->op;.  asse
4150: 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  rt( op==TK_VECTO
4160: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  R || op==TK_REGI
4170: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53  STER || op==TK_S
4180: 45 4c 45 43 54 20 29 3b 0a 20 20 69 66 28 20 6f  ELECT );.  if( o
4190: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
41a0: 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  {.    *ppExpr = 
41b0: 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
41c0: 6c 64 53 75 62 65 78 70 72 28 70 56 65 63 74 6f  ldSubexpr(pVecto
41d0: 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  r, iField);.    
41e0: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e  return pVector->
41f0: 69 54 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20  iTable+iField;. 
4200: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
4210: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70  SELECT ){.    *p
4220: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
4230: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
4240: 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45  st->a[iField].pE
4250: 78 70 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e  xpr;.     return
4260: 20 72 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c   regSelect+iFiel
4270: 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72  d;.  }.  *ppExpr
4280: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
4290: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
42a0: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  Expr;.  return s
42b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
42c0: 6d 70 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78  mp(pParse, *ppEx
42d0: 70 72 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d  pr, pRegFree);.}
42e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
42f0: 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  on pExpr is a co
4300: 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
4310: 20 74 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75   two vector valu
4320: 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74  es. Compute.** t
4330: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
4340: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20   comparison (1, 
4350: 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20  0, or NULL) and 
4360: 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65  write that.** re
4370: 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74  sult into regist
4380: 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  er dest..**.** T
4390: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73  he caller must s
43a0: 61 74 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f  atisfy the follo
43b0: 77 69 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f  wing preconditio
43c0: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20  ns:.**.**    if 
43d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
43e0: 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51  :      op==TK_EQ
43f0: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
4400: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20  NULLEQ.**    if 
4410: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4420: 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45  NOT:   op==TK_NE
4430: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
4440: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68  NULLEQ.**    oth
4450: 65 72 77 69 73 65 3a 20 20 20 20 20 20 20 20 20  erwise:         
4460: 20 20 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72         op==pExpr
4470: 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a  ->op and p5==0.*
4480: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
4490: 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
44a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
44b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ,        /* Code
44c0: 20 67 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65   generator conte
44d0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
44e0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
44f0: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
4500: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
4510: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
4520: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
4530: 73 75 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20  sults into this 
4540: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38  register */.  u8
4550: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
4560: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
4570: 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  n operator */.  
4580: 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
4590: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
45a0: 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a  NULLEQ or zero *
45b0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
45c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
45d0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
45e0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
45f0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
4600: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
4610: 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69  int nLeft = sqli
4620: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
4630: 65 28 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20  e(pLeft);.  int 
4640: 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74  i;.  int regLeft
4650: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52   = 0;.  int regR
4660: 69 67 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f  ight = 0;.  u8 o
4670: 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61  px = op;.  int a
4680: 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  ddrDone = sqlite
4690: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
46a0: 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21  );..  if( nLeft!
46b0: 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74  =sqlite3ExprVect
46c0: 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29 20 29  orSize(pRight) )
46d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
46e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
46f0: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
4700: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
4710: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45    }.  assert( pE
4720: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
4730: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4740: 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45  NE .       || pE
4750: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
4760: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4770: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c  ISNOT .       ||
4780: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4790: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
47a0: 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c  TK_GT .       ||
47b0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
47c0: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
47d0: 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73  TK_GE .  );.  as
47e0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
47f0: 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  =op || (pExpr->o
4800: 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d  p==TK_IS && op==
4810: 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20  TK_EQ).         
4820: 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70     || (pExpr->op
4830: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70  ==TK_ISNOT && op
4840: 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73  ==TK_NE) );.  as
4850: 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70  sert( p5==0 || p
4860: 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a  Expr->op!=op );.
4870: 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51    assert( p5==SQ
4880: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70  LITE_NULLEQ || p
4890: 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a  Expr->op==op );.
48a0: 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f  .  p5 |= SQLITE_
48b0: 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f  STOREP2;.  if( o
48c0: 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20  px==TK_LE ) opx 
48d0: 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f  = TK_LT;.  if( o
48e0: 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20  px==TK_GE ) opx 
48f0: 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c  = TK_GT;..  regL
4900: 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75  eft = exprCodeSu
4910: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
4920: 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67  pLeft);.  regRig
4930: 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ht = exprCodeSub
4940: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4950: 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69  Right);..  for(i
4960: 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69  =0; 1 /*Loop exi
4970: 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b  ts by "break"*/;
4980: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   i++){.    int r
4990: 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67  egFree1 = 0, reg
49a0: 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45  Free2 = 0;.    E
49b0: 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20  xpr *pL, *pR; . 
49c0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20     int r1, r2;. 
49d0: 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
49e0: 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20  && i<nLeft );.  
49f0: 20 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69    if( i>0 ) sqli
4a00: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
4a10: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 31  (pParse);.    r1
4a20: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
4a30: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c  ister(pParse, pL
4a40: 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c  eft, i, regLeft,
4a50: 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29   &pL, &regFree1)
4a60: 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56  ;.    r2 = exprV
4a70: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4a80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c  arse, pRight, i,
4a90: 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20   regRight, &pR, 
4aa0: 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
4ab0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
4ac0: 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c  se, pL, pR, opx,
4ad0: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70   r1, r2, dest, p
4ae0: 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  5);.    testcase
4af0: 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
4b00: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4b10: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65  ==OP_Lt);.    te
4b20: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
4b30: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4b40: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
4b50: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4b60: 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
4b70: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4b80: 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Gt);.    testca
4b90: 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
4ba0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4bb0: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
4bc0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4bd0: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
4be0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
4bf0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4c00: 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
4c10: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4c20: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69  OP_Ne);.    sqli
4c30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4c40: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
4c50: 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e1);.    sqlite3
4c60: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
4c70: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
4c80: 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 20  ;.    if( i>0 ) 
4c90: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
4ca0: 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
4cb0: 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31 20   if( i==nLeft-1 
4cc0: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
4cd0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
4ce0: 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  x==TK_EQ ){.    
4cf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d00: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
4d10: 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29   dest, addrDone)
4d20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4d30: 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53  );.      p5 |= S
4d40: 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a  QLITE_KEEPNULL;.
4d50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
4d60: 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20  x==TK_NE ){.    
4d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d80: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65  Op2(v, OP_If, de
4d90: 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56  st, addrDone); V
4da0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4db0: 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49        p5 |= SQLI
4dc0: 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20  TE_KEEPNULL;.   
4dd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4de0: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  sert( op==TK_LT 
4df0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20  || op==TK_GT || 
4e00: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op==TK_LE || op=
4e10: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
4e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e30: 32 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45  2(v, OP_ElseNotE
4e40: 71 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b  q, 0, addrDone);
4e50: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
4e60: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
4e70: 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LT);.      VdbeC
4e80: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
4e90: 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56  =TK_GT);.      V
4ea0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4eb0: 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20   op==TK_LE);.   
4ec0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
4ed0: 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b  f(v, op==TK_GE);
4ee0: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  .      if( i==nL
4ef0: 65 66 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70  eft-2 ) opx = op
4f00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
4f10: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
4f20: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e  Label(v, addrDon
4f30: 65 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  e);.}..#if SQLIT
4f40: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
4f50: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
4f60: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
4f70: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
4f80: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
4f90: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
4fa0: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
4fb0: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
4fc0: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
4fd0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
4fe0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
4ff0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
5000: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
5010: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
5020: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
5030: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
5040: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
5050: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
5060: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
5070: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
5080: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
5090: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
50a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
50b0: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
50c0: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
50d0: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
50e0: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
50f0: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
5100: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
5110: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5120: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
5130: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
5140: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
5150: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
5160: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
5170: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5180: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
5190: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
51a0: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
51b0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
51c0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
51d0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
51e0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
51f0: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
5200: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
5210: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5220: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
5230: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
5240: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
5250: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
5260: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
5270: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
5280: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
5290: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
52a0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
52b0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
52c0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
52d0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
52e0: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
52f0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
5300: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
5310: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
5320: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
5330: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
5340: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
5350: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5360: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
5370: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5380: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
5390: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
53a0: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
53b0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
53c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
53d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
53e0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
53f0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5400: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
5410: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5420: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5430: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5440: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5450: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5460: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5470: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5480: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5490: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
54a0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
54b0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
54c0: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
54d0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
54e0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
54f0: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
5500: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5510: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
5520: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
5530: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5540: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
5550: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
5560: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
5570: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
5580: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
5590: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
55a0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
55b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
55c0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
55d0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
55e0: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
55f0: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
5600: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
5610: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
5620: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
5630: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
5640: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
5650: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
5660: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
5670: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
5680: 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61  opagate EP_Propa
5690: 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72  gate flags up fr
56a0: 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  om Expr.x.pList 
56b0: 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a  to Expr.flags,.*
56c0: 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  * if appropriate
56d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
56e0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
56f0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
5700: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5710: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5720: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
5730: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5740: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
5750: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
5760: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5770: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5780: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
5790: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
57a0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
57b0: 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73  se if( p->x.pLis
57c0: 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  t ){.    heightO
57d0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
57e0: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
57f0: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5800: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5810: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5820: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5830: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
5840: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
5850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
5860: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5870: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
5880: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
5890: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
58a0: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
58b0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
58c0: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
58d0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
58e0: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
58f0: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
5900: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5910: 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f  agate all EP_Pro
5920: 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f  pagate flags fro
5930: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
5940: 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e  st into.** Expr.
5950: 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20  flags. .*/.void 
5960: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
5970: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72  ightAndFlags(Par
5980: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5990: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72   *p){.  if( pPar
59a0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
59b0: 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67  n;.  exprSetHeig
59c0: 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ht(p);.  sqlite3
59d0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
59e0: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
59f0: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ht);.}../*.** Re
5a00: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
5a10: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65   height of any e
5a20: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
5a30: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20  eferenced.** by 
5a40: 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
5a50: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
5a60: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
5a70: 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
5a80: 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63  ExprHeight(Selec
5a90: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  t *p){.  int nHe
5aa0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5ab0: 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e  htOfSelect(p, &n
5ac0: 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72  Height);.  retur
5ad0: 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c  n nHeight;.}.#el
5ae0: 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65  se /* ABOVE:  He
5af0: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
5b00: 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57   enabled.  BELOW
5b10: 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65  : Height enforce
5b20: 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a  ment off */./*.*
5b30: 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20  * Propagate all 
5b40: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
5b50: 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  gs from the Expr
5b60: 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a  .x.pList into.**
5b70: 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f   Expr.flags. .*/
5b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5b90: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
5ba0: 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
5bb0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
5bc0: 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ( p && p->x.pLis
5bd0: 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  t && !ExprHasPro
5be0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5bf0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d  elect) ){.    p-
5c00: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f  >flags |= EP_Pro
5c10: 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33  pagate & sqlite3
5c20: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
5c30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  >x.pList);.  }.}
5c40: 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74  .#define exprSet
5c50: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
5c60: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
5c70: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
5c80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5c90: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
5ca0: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
5cb0: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
5cc0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
5cd0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
5ce0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
5cf0: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
5d00: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
5d10: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
5d20: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
5d30: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
5d40: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
5d50: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
5d60: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
5d70: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
5d80: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
5d90: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
5da0: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
5db0: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
5dc0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
5dd0: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
5de0: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
5df0: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
5e00: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
5e10: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
5e20: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
5e30: 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20  performed.  The 
5e40: 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d  deQuote.** param
5e50: 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
5e60: 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
5e70: 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65  L or if the toke
5e80: 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70  n does not.** ap
5e90: 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65  pear to be quote
5ea0: 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65  d.  If the quote
5eb0: 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f  s were of the fo
5ec0: 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65  rm "..." (double
5ed0: 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e  -quotes).** then
5ee0: 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65   the EP_DblQuote
5ef0: 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  d flag is set on
5f00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5f10: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63  node..**.** Spec
5f20: 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70  ial case:  If op
5f30: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64  ==TK_INTEGER and
5f40: 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74   pToken points t
5f50: 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a  o a string that.
5f60: 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c  ** can be transl
5f70: 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62  ated into a 32-b
5f80: 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  it integer, then
5f90: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f   the token is no
5fa0: 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75  t.** stored in u
5fb0: 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61  .zToken.  Instea
5fc0: 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  d, the integer v
5fd0: 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e  alues is written
5fe0: 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75  .** into u.iValu
5ff0: 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74  e and the EP_Int
6000: 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65  Value flag is se
6010: 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f  t.  No extra sto
6020: 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63  rage.** is alloc
6030: 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
6040: 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e   integer text an
6050: 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c  d the dequote fl
6060: 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ag is ignored..*
6070: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6080: 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69  xprAlloc(.  sqli
6090: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
60a0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
60b0: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
60c0: 63 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e  cRawNN() */.  in
60d0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
60e0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
60f0: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6100: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
6110: 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ken,    /* Token
6120: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6130: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t be NULL */.  i
6140: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
6150: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
6160: 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a  o dequote */.){.
6170: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
6180: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
6190: 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30    int iValue = 0
61a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
61b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
61c0: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70  en ){.    if( op
61d0: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
61e0: 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20  pToken->z==0.   
61f0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
6200: 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e  3GetInt32(pToken
6210: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30  ->z, &iValue)==0
6220: 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
6230: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a   = pToken->n+1;.
6240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56        assert( iV
6250: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  alue>=0 );.    }
6260: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71  .  }.  pNew = sq
6270: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
6280: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
6290: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
62a0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
62b0: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
62c0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
62d0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
62e0: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
62f0: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
6300: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
6310: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
6320: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
6330: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
6340: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
6350: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
6360: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
6370: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
6380: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6390: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
63a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
63b0: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
63c0: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
63d0: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
63e0: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
63f0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
6400: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
6410: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
6420: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
6430: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
6440: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
6450: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
6460: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
6470: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
6480: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
6490: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
64a0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
64b0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
64c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
64d0: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
64e0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
64f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6500: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6510: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6520: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6530: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6540: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6550: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6560: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
6570: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
6580: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
6590: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
65a0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
65b0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
65c0: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
65d0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
65e0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
65f0: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6600: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6610: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6620: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6630: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6640: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6650: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6660: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
6670: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
6680: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6690: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
66a0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
66b0: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
66c0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
66d0: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
66e0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
66f0: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
6700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
6710: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
6720: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
6730: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
6740: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
6750: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
6760: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
6770: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6780: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
6790: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
67a0: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
67b0: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
67c0: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
67d0: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
67e0: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
67f0: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
6800: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
6810: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
6820: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
6830: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
6840: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
6850: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
6860: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6870: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
6880: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6890: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
68a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
68b0: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
68c0: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
68d0: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
68e0: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
68f0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52  P_Propagate & pR
6900: 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ight->flags;.   
6910: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
6920: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
6930: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
6940: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
6950: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
6960: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
6970: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
6980: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
6990: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
69a0: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72  Allocate an Expr
69b0: 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e   node which join
69c0: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f  s as many as two
69d0: 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a   subtrees..**.**
69e0: 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   One or both of 
69f0: 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e  the subtrees can
6a00: 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72   be NULL.  Retur
6a10: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
6a20: 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e  he new.** Expr n
6a30: 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20  ode.  Or, if an 
6a40: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6a50: 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62  , set pParse->db
6a60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a  ->mallocFailed,.
6a70: 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74  ** free the subt
6a80: 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20  rees and return 
6a90: 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  NULL..*/.Expr *s
6aa0: 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50  qlite3PExpr(.  P
6ab0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6ac0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6ad0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
6ae0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
6af0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6b00: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
6b10: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
6b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
6b30: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
6b40: 70 72 20 2a 70 52 69 67 68 74 20 20 20 20 20 20  pr *pRight      
6b50: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f        /* Right o
6b60: 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45  perand */.){.  E
6b70: 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70  xpr *p;.  if( op
6b80: 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72  ==TK_AND && pPar
6b90: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
6ba0: 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e     /* Take advan
6bb0: 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69  tage of short-ci
6bc0: 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69  rcuit false opti
6bd0: 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44  mization for AND
6be0: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
6bf0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
6c00: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52  e->db, pLeft, pR
6c10: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6c20: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
6c30: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61  bMallocRawNN(pPa
6c40: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
6c50: 45 78 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20  Expr));.    if( 
6c60: 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  p ){.      memse
6c70: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  t(p, 0, sizeof(E
6c80: 78 70 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xpr));.      p->
6c90: 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f  op = op & TKFLG_
6ca0: 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  MASK;.      p->i
6cb0: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Agg = -1;.    }.
6cc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
6cd0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
6ce0: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
6cf0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
6d00: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
6d10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
6d20: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
6d30: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
6d40: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
6d50: 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63  /*.** Add pSelec
6d60: 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e  t to the Expr.x.
6d70: 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20  pSelect field.  
6d80: 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20  Or, if pExpr is 
6d90: 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20  NULL (due.** do 
6da0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
6db0: 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65  ion failure) the
6dc0: 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65  n delete the pSe
6dd0: 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  lect object..*/.
6de0: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70  void sqlite3PExp
6df0: 72 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65  rAddSelect(Parse
6e00: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
6e10: 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70  pExpr, Select *p
6e20: 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70  Select){.  if( p
6e30: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70  Expr ){.    pExp
6e40: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70  r->x.pSelect = p
6e50: 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72  Select;.    Expr
6e60: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
6e70: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c  r, EP_xIsSelect|
6e80: 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20  EP_Subquery);.  
6e90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
6ea0: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70  HeightAndFlags(p
6eb0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
6ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6ed0: 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
6ee0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6ef0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
6f00: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
6f10: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
6f20: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  }.}.../*.** If t
6f30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6f40: 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 54   always either T
6f50: 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65  RUE or FALSE (re
6f60: 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20  spectively),.** 
6f70: 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20  then return 1.  
6f80: 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65  If one cannot de
6f90: 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74  termine the trut
6fa0: 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  h value of the.*
6fb0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  * expression at 
6fc0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74  compile-time ret
6fd0: 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urn 0..**.** Thi
6fe0: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
6ff0: 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20  tion.  If is OK 
7000: 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72 65  to return 0 here
7010: 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20   even if.** the 
7020: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c  expression reall
7030: 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73  y is always fals
7040: 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61  e or false (a fa
7050: 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a  lse negative)..*
7060: 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75  * But it is a bu
7070: 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66  g to return 1 if
7080: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7090: 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66 65  might have diffe
70a0: 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20  rent.** boolean 
70b0: 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72  values in differ
70c0: 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65  ent circumstance
70d0: 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74  s (a false posit
70e0: 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ive.).**.** Note
70f0: 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70   that if the exp
7100: 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20  ression is part 
7110: 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66  of conditional f
7120: 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49  or a.** LEFT JOI
7130: 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f  N, then we canno
7140: 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63  t determine at c
7150: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74  ompile-time whet
7160: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73  her or not.** is
7170: 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73   it true or fals
7180: 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74  e, so always ret
7190: 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
71a0: 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54   int exprAlwaysT
71b0: 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  rue(Expr *p){.  
71c0: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28  int v = 0;.  if(
71d0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
71e0: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
71f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
7200: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
7210: 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20  sInteger(p, &v) 
7220: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
7230: 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61  turn v!=0;.}.sta
7240: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
7250: 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29  ysFalse(Expr *p)
7260: 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20  {.  int v = 0;. 
7270: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
7280: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
7290: 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
72a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
72b0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20  xprIsInteger(p, 
72c0: 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  &v) ) return 0;.
72d0: 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d    return v==0;.}
72e0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
72f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
7300: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
7310: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
7320: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
7330: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
7340: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
7350: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
7360: 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f  ** If one side o
7370: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
7380: 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20  he AND is known 
7390: 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65  to be false, the
73a0: 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  n instead.** of 
73b0: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44  returning an AND
73c0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73   expression, jus
73d0: 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74  t return a const
73e0: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ant expression w
73f0: 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f  ith.** a value o
7400: 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72  f false..*/.Expr
7410: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
7420: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
7430: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
7440: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
7450: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
7460: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
7470: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
7480: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
7490: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
74a0: 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
74b0: 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20  False(pLeft) || 
74c0: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
74d0: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73  pRight) ){.    s
74e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
74f0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
7500: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7510: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
7520: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
7530: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
7540: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
7550: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d  ite3IntTokens[0]
7560: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
7570: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
7580: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7590: 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  (db, TK_AND, 0, 
75a0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
75b0: 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65  xprAttachSubtree
75c0: 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66  s(db, pNew, pLef
75d0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
75e0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d  return pNew;.  }
75f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
7600: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
7610: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
7620: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
7630: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
7640: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
7650: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
7660: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
7670: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7680: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
7690: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
76a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
76b0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
76c0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
76d0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
76e0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
76f0: 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65  _FUNCTION, pToke
7700: 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65  n, 1);.  if( pNe
7710: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
7720: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
7730: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a  e(db, pList); /*
7740: 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65   Avoid memory le
7750: 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  ak when malloc f
7760: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
7770: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
7780: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
7790: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  t;.  assert( !Ex
77a0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
77b0: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
77c0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ) );.  sqlite3Ex
77d0: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
77e0: 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ags(pParse, pNew
77f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
7800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
7810: 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  n a variable num
7820: 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ber to an expres
7830: 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65  sion that encode
7840: 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  s a wildcard.** 
7850: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
7860: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
7870: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
7880: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
7890: 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20   single "?" are 
78a0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78  assigned the nex
78b0: 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20  t sequential.** 
78c0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e  variable number.
78d0: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
78e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
78f0: 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  nn" are assigned
7900: 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e   the number "nnn
7910: 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73  ".  We make.** s
7920: 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74  ure "nnn" is not
7930: 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69   too big to avoi
7940: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
7950: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
7960: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
7970: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
7980: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
7990: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
79a0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
79b0: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
79c0: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
79d0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
79e0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
79f0: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
7a00: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
7a10: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
7a20: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
7a30: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
7a40: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
7a50: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
7a60: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
7a70: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
7a80: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
7a90: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
7aa0: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
7ab0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7ac0: 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71  pr, u32 n){.  sq
7ad0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7ae0: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
7af0: 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72  char *z;.  ynVar
7b00: 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72   x;..  if( pExpr
7b10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7b20: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
7b30: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7b40: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
7b50: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7b60: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
7b70: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
7b80: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
7b90: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
7ba0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7bb0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
7bc0: 33 30 28 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a  30(z) );.  if( z
7bd0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
7be0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
7bf0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
7c00: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
7c10: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
7c20: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
7c30: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d 20  ='?' );.    x = 
7c40: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
7c50: 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65  ->nVar);.  }else
7c60: 7b 0a 20 20 20 20 69 6e 74 20 64 6f 41 64 64 20  {.    int doAdd 
7c70: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  = 0;.    if( z[0
7c80: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='?' ){.      
7c90: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
7ca0: 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20  he form "?nnn". 
7cb0: 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74   Convert "nnn" t
7cc0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  o an integer and
7cd0: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74  .      ** use it
7ce0: 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65   as the variable
7cf0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20   number */.     
7d00: 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e   i64 i;.      in
7d10: 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74  t bOk = 0==sqlit
7d20: 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20  e3Atoi64(&z[1], 
7d30: 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f  &i, n-1, SQLITE_
7d40: 55 54 46 38 29 3b 0a 20 20 20 20 20 20 78 20 3d  UTF8);.      x =
7d50: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
7d60: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
7d70: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7d80: 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20  e( i==1 );.     
7d90: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
7da0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7db0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7dc0: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
7dd0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
7de0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7df0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
7e00: 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20  NUMBER] );.     
7e10: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69   if( bOk==0 || i
7e20: 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d  <1 || i>db->aLim
7e30: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7e40: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7e50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7e60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7e70: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
7e80: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
7e90: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
7ea0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  ,.            db
7eb0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7ec0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7ed0: 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20  UMBER]);.       
7ee0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
7ef0: 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50 61  .      if( x>pPa
7f00: 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  rse->nVar ){.   
7f10: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
7f20: 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20  r = (int)x;.    
7f30: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
7f40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7f50: 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
7f60: 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
7f70: 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20  ist, x)==0 ){.  
7f80: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
7f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7fa0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c  se{.      /* Wil
7fb0: 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61  dcards like ":aa
7fc0: 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40  a", "$aaa" or "@
7fd0: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
7fe0: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
7ff0: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61       ** number a
8000: 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65  s the prior appe
8010: 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  arance of the sa
8020: 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74  me name, or if t
8030: 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he name.      **
8040: 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61   has never appea
8050: 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73  red before, reus
8060: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
8070: 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  ble number.     
8080: 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79   */.      x = (y
8090: 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73  nVar)sqlite3VLis
80a0: 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73  tNameToNum(pPars
80b0: 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29  e->pVList, z, n)
80c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30  ;.      if( x==0
80d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20   ){.        x = 
80e0: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
80f0: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20  ->nVar);.       
8100: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
8110: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8120: 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20  ( doAdd ){.     
8130: 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20   pParse->pVList 
8140: 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64  = sqlite3VListAd
8150: 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56  d(db, pParse->pV
8160: 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a  List, z, n, x);.
8170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70      }.  }.  pExp
8180: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a  r->iColumn = x;.
8190: 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d    if( x>db->aLim
81a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
81b0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
81c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
81d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
81e0: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
81f0: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
8200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
8210: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
8220: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
8230: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8240: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71  NOINLINE void sq
8250: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8260: 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  N(sqlite3 *db, E
8270: 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  xpr *p){.  asser
8280: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  t( p!=0 );.  /* 
8290: 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73  Sanity check: As
82a0: 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49 6e  sert that the In
82b0: 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65  tValue is non-ne
82c0: 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78 69  gative if it exi
82d0: 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sts */.  assert(
82e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
82f0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
8300: 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ) || p->u.iValue
8310: 3e 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  >=0 );.#ifdef SQ
8320: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
8330: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8340: 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20  (p, EP_Leaf) && 
8350: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8360: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8370: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
8380: 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a   p->pLeft==0 );.
8390: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
83a0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
83b0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65  assert( p->x.pSe
83c0: 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  lect==0 );.  }.#
83d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78 70  endif.  if( !Exp
83e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
83f0: 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  (EP_TokenOnly|EP
8400: 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f  _Leaf)) ){.    /
8410: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
8420: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
8430: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
8440: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
8450: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
8460: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  p->x.pList==0 ||
8470: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
8480: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
8490: 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53  t && p->op!=TK_S
84a0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73  ELECT_COLUMN ) s
84b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
84c0: 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29  NN(db, p->pLeft)
84d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
84e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
84f0: 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
8500: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8510: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
8520: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8530: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
8540: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
8550: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8560: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8570: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8580: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
8590: 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
85a0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
85b0: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
85c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
85d0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  u.zToken);.  if(
85e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
85f0: 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20  y(p, EP_Static) 
8600: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
8610: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
8620: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
8630: 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65  xprDelete(sqlite
8640: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
8650: 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74  .  if( p ) sqlit
8660: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64  e3ExprDeleteNN(d
8670: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
8680: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
8690: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
86a0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
86b0: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
86c0: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
86d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
86e0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
86f0: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
8700: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
8710: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
8720: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
8730: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
8740: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
8750: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
8760: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8770: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8780: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8790: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
87a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
87b0: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
87c0: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
87d0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
87e0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
87f0: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
8800: 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69  The dupedExpr*Si
8810: 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61  ze() routines ea
8820: 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ch return the nu
8830: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
8840: 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f  quired.** to sto
8850: 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  re a copy of an 
8860: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78  expression or ex
8870: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
8880: 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a  They differ in.*
8890: 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  * how much of th
88a0: 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72  e tree is measur
88b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75  ed..**.**     du
88c0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
88d0: 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20  e()     Size of 
88e0: 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74  only the Expr st
88f0: 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20  ructure .**     
8900: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
8910: 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f  e()       Size o
8920: 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66  f Expr + space f
8930: 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20  or token.**     
8940: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20  dupedExprSize() 
8950: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b            Expr +
8960: 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65   token + subtree
8970: 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a   components.**.*
8980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
89a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
89b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
89c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
89d0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74   The dupedExprSt
89e0: 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74  ructSize() funct
89f0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20  ion returns two 
8a00: 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67  values OR-ed tog
8a10: 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20  ether:  .** (1) 
8a20: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
8a30: 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66  ed for a copy of
8a40: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
8a50: 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a  ure only and .**
8a60: 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20   (2) the EP_xxx 
8a70: 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  flags that indic
8a80: 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72  ate what the str
8a90: 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75  ucture size shou
8aa0: 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65  ld be..** The re
8ab0: 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61  turn values is a
8ac0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
8ad0: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55  .**      EXPR_FU
8ae0: 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45  LLSIZE.**      E
8af0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8b00: 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a    | EP_Reduced.*
8b10: 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45  *      EXPR_TOKE
8b20: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
8b30: 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54  okenOnly.**.** T
8b40: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  he size of the s
8b50: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
8b60: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
8b70: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
8b80: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75  e.** of this rou
8b90: 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e  tine with 0xfff.
8ba0: 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20    The flags can 
8bb0: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8bc0: 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  ing the.** retur
8bd0: 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f  n value with EP_
8be0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
8bf0: 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  Only..**.** Note
8c00: 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73   that with flags
8c10: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
8c20: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20  , this routines 
8c30: 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69  works on full-si
8c40: 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64  ze.** (unreduced
8c50: 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61  ) Expr objects a
8c60: 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e  s they or origin
8c70: 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64  ally constructed
8c80: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a   by the parser..
8c90: 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73  ** During expres
8ca0: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65  sion analysis, e
8cb0: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
8cc0: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
8cd0: 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c   moved into.** l
8ce0: 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65  ater parts of te
8cf0: 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  h Expr object an
8d00: 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  d that extra inf
8d10: 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67  ormation might g
8d20: 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66  et chopped.** of
8d30: 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  f if the express
8d40: 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20  ion is reduced. 
8d50: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
8d60: 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  it does not work
8d70: 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45   to.** make an E
8d80: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
8d90: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
8da0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
8db0: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
8dc0: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
8dd0: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
8de0: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
8df0: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
8e00: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
8e10: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8e20: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
8e30: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
8e40: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
8e50: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
8e60: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
8e70: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
8e80: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
8e90: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
8ea0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8eb0: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
8ec0: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
8ed0: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
8ee0: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
8ef0: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
8f00: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61  e allowed */.  a
8f10: 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c  ssert( EXPR_FULL
8f20: 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20  SIZE<=0xfff );. 
8f30: 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20   assert( (0xfff 
8f40: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
8f50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20  _TokenOnly))==0 
8f60: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67  );.  if( 0==flag
8f70: 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53  s || p->op==TK_S
8f80: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  ELECT_COLUMN ){.
8f90: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
8fa0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
8fb0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
8fc0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8fd0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8fe0: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
8ff0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9000: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9010: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20  EP_FromJoin) ); 
9020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9030: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9040: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b   EP_MemToken) );
9050: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9060: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9070: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b   EP_NoReduce) );
9080: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
9090: 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20  t || p->x.pList 
90a0: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
90b0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
90c0: 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a  E | EP_Reduced;.
90d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
90e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
90f0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ht==0 );.      n
9100: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
9110: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
9120: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
9130: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
9140: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
9150: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9160: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
9170: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
9180: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
9190: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
91a0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
91b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
91c0: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
91d0: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
91e0: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
91f0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
9200: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
9210: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9220: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
9230: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
9240: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
9250: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
9260: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9270: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
9280: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
9290: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
92a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
92b0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
92c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
92d0: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
92e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
92f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
9300: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
9310: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
9320: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
9330: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
9340: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
9350: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
9360: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
9370: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
9380: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
9390: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
93a0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
93b0: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
93c0: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
93d0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
93e0: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
93f0: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
9400: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
9410: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
9420: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
9430: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
9440: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
9450: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
9460: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
9470: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
9480: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
9490: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
94a0: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
94b0: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
94c0: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
94d0: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
94e0: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
94f0: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
9500: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
9510: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
9520: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
9530: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
9540: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
9550: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
9560: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9570: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
9580: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
9590: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
95a0: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
95b0: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
95c0: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
95d0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
95e0: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
95f0: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
9600: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
9610: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
9620: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9630: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
9640: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9650: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
9660: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
9670: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
9680: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
9690: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
96a0: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
96b0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
96c0: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
96d0: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
96e0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
96f0: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
9700: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
9710: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
9720: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
9730: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
9740: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
9750: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
9760: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
9770: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
9780: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
9790: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
97a0: 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70  te past the.** p
97b0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  ortion of the bu
97c0: 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f  ffer copied into
97d0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
97e0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  n..*/.static Exp
97f0: 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74  r *exprDup(sqlit
9800: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
9810: 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75   int dupFlags, u
9820: 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20  8 **pzBuffer){. 
9830: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
9840: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
9850: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75  to return */.  u
9860: 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20  8 *zAlloc;      
9870: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
9880: 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20  pace from which 
9890: 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62  to build Expr ob
98a0: 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74  ject */.  u32 st
98b0: 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20  aticFlag;       
98c0: 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20  /* EP_Static if 
98d0: 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e  space not obtain
98e0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a  ed from malloc *
98f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  /..  assert( db!
9900: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9910: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  p );.  assert( d
9920: 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75  upFlags==0 || du
9930: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
9940: 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65  REDUCE );.  asse
9950: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
9960: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
9970: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a  RDUP_REDUCE );..
9980: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
9990: 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  where to write t
99a0: 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75  he new Expr stru
99b0: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20  cture. */.  if( 
99c0: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
99d0: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
99e0: 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  er;.    staticFl
99f0: 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a  ag = EP_Static;.
9a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c    }else{.    zAl
9a10: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
9a20: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64  allocRawNN(db, d
9a30: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
9a40: 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  dupFlags));.    
9a50: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
9a60: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78    }.  pNew = (Ex
9a70: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
9a80: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
9a90: 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20  /* Set nNewSize 
9aa0: 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f  to the size allo
9ab0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74  cated for the st
9ac0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
9ad0: 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65  to.    ** by pNe
9ae0: 77 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65  w. This is eithe
9af0: 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  r EXPR_FULLSIZE,
9b00: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
9b10: 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52  E or.    ** EXPR
9b20: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
9b30: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
9b40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9b50: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
9b60: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
9b70: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
9b80: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
9b90: 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
9ba0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e  const unsigned n
9bb0: 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70  StructSize = dup
9bc0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9bd0: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  (p, dupFlags);. 
9be0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65     const int nNe
9bf0: 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53  wSize = nStructS
9c00: 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20  ize & 0xfff;.   
9c10: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
9c20: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
9c30: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
9c40: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
9c50: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54  oken ){.      nT
9c60: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
9c70: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
9c80: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c  en) + 1;.    }el
9c90: 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e  se{.      nToken
9ca0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
9cb0: 69 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a  if( dupFlags ){.
9cc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
9cd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9ce0: 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20   EP_Reduced)==0 
9cf0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9d00: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
9d10: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
9d20: 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65  .      u32 nSize
9d30: 20 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75   = (u32)exprStru
9d40: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
9d50: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
9d60: 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  p, nSize);.     
9d70: 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f   if( nSize<EXPR_
9d80: 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20  FULLSIZE ){ .   
9d90: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
9da0: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
9db0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
9dc0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
9dd0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
9de0: 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45  he EP_Reduced, E
9df0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64  P_TokenOnly, and
9e00: 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73   EP_Static flags
9e10: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
9e20: 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  */.    pNew->fla
9e30: 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63  gs &= ~(EP_Reduc
9e40: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  ed|EP_TokenOnly|
9e50: 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d  EP_Static|EP_Mem
9e60: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77  Token);.    pNew
9e70: 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75  ->flags |= nStru
9e80: 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64  ctSize & (EP_Red
9e90: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9ea0: 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  y);.    pNew->fl
9eb0: 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61  ags |= staticFla
9ec0: 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  g;..    /* Copy 
9ed0: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
9ee0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
9ef0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  */.    if( nToke
9f00: 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  n ){.      char 
9f10: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
9f20: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
9f30: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
9f40: 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ze];.      memcp
9f50: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
9f60: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
9f70: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30      }..    if( 0
9f80: 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65  ==((p->flags|pNe
9f90: 77 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f  w->flags) & (EP_
9fa0: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61  TokenOnly|EP_Lea
9fb0: 66 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  f)) ){.      /* 
9fc0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77  Fill in the pNew
9fd0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70  ->x.pSelect or p
9fe0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d  New->x.pList mem
9ff0: 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ber. */.      if
a000: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a010: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
a020: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  t) ){.        pN
a030: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  ew->x.pSelect = 
a040: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
a050: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
a060: 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  t, dupFlags);.  
a070: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a080: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
a090: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
a0a0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  stDup(db, p->x.p
a0b0: 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  List, dupFlags);
a0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
a0d0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70      /* Fill in p
a0e0: 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  New->pLeft and p
a0f0: 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a  New->pRight. */.
a100: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
a110: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
a120: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
a130: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
a140: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
a150: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64  xprNodeSize(p, d
a160: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a170: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a180: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f  erty(pNew, EP_To
a190: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a1a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a1b0: 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65  ->pLeft = p->pLe
a1c0: 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ft ?.           
a1d0: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44             exprD
a1e0: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
a1f0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
a200: 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20   &zAlloc) : 0;. 
a210: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
a220: 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20  ght = p->pRight 
a230: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
a240: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a250: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a260: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
a270: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
a280: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a290: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
a2a0: 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20      *pzBuffer = 
a2b0: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a  zAlloc;.      }.
a2c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a2d0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
a2e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
a2f0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a300: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  {.        if( pN
a310: 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  ew->op==TK_SELEC
a320: 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  T_COLUMN ){.    
a330: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
a340: 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  t = p->pLeft;.  
a350: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a360: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c  p->iColumn==0 ||
a370: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
a380: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
a390: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
a3a0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70   || p->pRight==p
a3b0: 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ->pLeft );.     
a3c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3d0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a3e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a3f0: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30  (db, p->pLeft, 0
a400: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
a410: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a420: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
a430: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
a440: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
a450: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a460: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
a470: 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72  Create and retur
a480: 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66  n a deep copy of
a490: 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73   the object pass
a4a0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
a4b0: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49   .** argument. I
a4c0: 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f an OOM conditi
a4d0: 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  on is encountere
a4e0: 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  d, NULL is retur
a4f0: 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ned.** and the d
a500: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a510: 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66  flag set..*/.#if
a520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a530: 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68  _CTE.static With
a540: 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65   *withDup(sqlite
a550: 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b  3 *db, With *p){
a560: 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20  .  With *pRet = 
a570: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
a580: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
a590: 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f  zeof(*p) + sizeo
a5a0: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
a5b0: 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52  >nCte-1);.    pR
a5c0: 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
a5d0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
a5e0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  te);.    if( pRe
a5f0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
a600: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43  ;.      pRet->nC
a610: 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20  te = p->nCte;.  
a620: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a630: 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
a640: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
a650: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
a660: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
a670: 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c  p->a[i].pSelect,
a680: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
a690: 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20  t->a[i].pCols = 
a6a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a6b0: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70  up(db, p->a[i].p
a6c0: 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  Cols, 0);.      
a6d0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61    pRet->a[i].zNa
a6e0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
a6f0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  rDup(db, p->a[i]
a700: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
a710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a720: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73  urn pRet;.}.#els
a730: 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44  e.# define withD
a740: 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66  up(x,y) 0.#endif
a750: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
a760: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
a770: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
a780: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
a790: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
a7a0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
a7b0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
a7c0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
a7d0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
a7e0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
a7f0: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
a800: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
a810: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
a820: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
a830: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
a840: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
a850: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
a860: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
a870: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
a880: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
a890: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
a8a0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
a8b0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
a8c0: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
a8d0: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
a8e0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
a8f0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
a900: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
a910: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
a920: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
a930: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
a940: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
a950: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
a960: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
a970: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
a980: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
a990: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
a9a0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
a9b0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
a9c0: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
a9d0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
a9e0: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
a9f0: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
aa00: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
aa10: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
aa20: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
aa30: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
aa40: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
aa50: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
aa60: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
aa70: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
aa80: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
aa90: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
aaa0: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
aab0: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
aac0: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
aad0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
aae0: 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  DUCE );.  return
aaf0: 20 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c   p ? exprDup(db,
ab00: 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20   p, flags, 0) : 
ab10: 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73  0;.}.ExprList *s
ab20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
ab30: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
ab40: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
ab50: 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69  flags){.  ExprLi
ab60: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
ab70: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ab80: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
ab90: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  em;.  int i;.  a
aba0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
abb0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
abc0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
abd0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
abe0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
abf0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
ac00: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
ac10: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
ac20: 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72  r = i = p->nExpr
ac30: 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26  ;.  if( (flags &
ac40: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
ac50: 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69  ==0 ) for(i=1; i
ac60: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29  <p->nExpr; i+=i)
ac70: 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70  {}.  pNew->a = p
ac80: 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  Item = sqlite3Db
ac90: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
aca0: 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   i*sizeof(p->a[0
acb0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65  ]) );.  if( pIte
acc0: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
acd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
ace0: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
acf0: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
ad00: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
ad10: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
ad20: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
ad30: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
ad40: 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20   Expr *pOldExpr 
ad50: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
ad60: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  r;.    Expr *pNe
ad70: 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  wExpr;.    pItem
ad80: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
ad90: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
ada0: 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20  dExpr, flags);. 
adb0: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
adc0: 2d 3e 70 45 78 70 72 3d 3d 30 20 7c 7c 20 64 62  ->pExpr==0 || db
add0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
ade0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  0 );.    if( pOl
adf0: 64 45 78 70 72 20 0a 20 20 20 20 20 26 26 20 70  dExpr .     && p
ae00: 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  OldExpr->op==TK_
ae10: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20  SELECT_COLUMN.  
ae20: 20 20 20 26 26 20 28 70 4e 65 77 45 78 70 72 20     && (pNewExpr 
ae30: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21  = pItem->pExpr)!
ae40: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
ae50: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
ae60: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c  r->iColumn==0 ||
ae70: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66   i>0 );.      if
ae80: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
ae90: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
aea0: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78    assert( pOldEx
aeb0: 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45  pr->pLeft==pOldE
aec0: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20  xpr->pRight );. 
aed0: 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d         pNewExpr-
aee0: 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70  >pLeft = pNewExp
aef0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
af00: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
af10: 53 28 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  S(pItem[-1].pExp
af20: 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  r!=0) ){.       
af30: 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74   pNewExpr->pLeft
af40: 20 3d 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78   = pItem[-1].pEx
af50: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
af60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74   }.    }.    pIt
af70: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
af80: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
af90: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
afa0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
afb0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
afc0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
afd0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
afe0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
aff0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
b000: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
b010: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
b020: 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  pItem->bSpanIsTa
b030: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  b = pOldItem->bS
b040: 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49  panIsTab;.    pI
b050: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
b060: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
b070: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
b080: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
b090: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
b0a0: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
b0b0: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
b0c0: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
b0d0: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
b0e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
b0f0: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
b100: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
b110: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
b120: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
b130: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
b140: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
b150: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
b160: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
b170: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b180: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
b190: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b1a0: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
b1b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b1c0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
b1d0: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
b1e0: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
b1f0: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
b200: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b210: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
b220: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
b230: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
b240: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b250: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b260: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
b270: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
b280: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
b290: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
b2a0: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
b2b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b2c0: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
b2d0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b2e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b2f0: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
b300: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
b310: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
b320: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
b330: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b340: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b350: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b360: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
b370: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
b380: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
b390: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
b3a0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b3b0: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
b3c0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
b3d0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
b3e0: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
b3f0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b400: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
b410: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
b420: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b430: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b440: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b450: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
b460: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b470: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b480: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
b490: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
b4a0: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
b4b0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
b4c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
b4d0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
b4e0: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
b4f0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
b500: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
b510: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
b520: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
b530: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
b540: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
b550: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
b560: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
b570: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
b580: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b590: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
b5a0: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
b5b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
b5c0: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
b5d0: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
b5e0: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
b5f0: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
b600: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
b610: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
b620: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b630: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
b640: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
b650: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
b660: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
b670: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
b680: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
b690: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
b6a0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
b6b0: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
b6c0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
b6d0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
b6e0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
b6f0: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
b700: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
b710: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
b720: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
b730: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
b740: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b750: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
b760: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
b770: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
b780: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
b790: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
b7a0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
b7b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
b7c0: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
b7d0: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
b7e0: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
b7f0: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
b800: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  w;.  int i;.  as
b810: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b820: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b830: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b840: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b850: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
b860: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
b870: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
b880: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
b890: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
b8a0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
b8b0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d  llocRawNN(db, p-
b8c0: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
b8d0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
b8e0: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
b8f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b900: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  , pNew);.    ret
b910: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
b920: 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75 73  Note that becaus
b930: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
b940: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72  e allocation for
b950: 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20   p->a[] is not. 
b960: 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20   ** necessarily 
b970: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20  a power of two, 
b980: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
b990: 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65  end() may not be
b9a0: 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20   called.  ** on 
b9b0: 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 72  the duplicate cr
b9c0: 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  eated by this fu
b9d0: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72  nction. */.  for
b9e0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20  (i=0; i<p->nId; 
b9f0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
ba00: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e   IdList_item *pN
ba10: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
ba20: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
ba30: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f   IdList_item *pO
ba40: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
ba50: 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  ];.    pNewItem-
ba60: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
ba70: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
ba80: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
ba90: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78     pNewItem->idx
baa0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78   = pOldItem->idx
bab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
bac0: 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73  New;.}.Select *s
bad0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
bae0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
baf0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ect *p, int flag
bb00: 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  s){.  Select *pN
bb10: 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61  ew, *pPrior;.  a
bb20: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
bb30: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
bb40: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
bb50: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
bb60: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
bb70: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
bb80: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
bb90: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
bba0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
bbb0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
bbc0: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  st, flags);.  pN
bbd0: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
bbe0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
bbf0: 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29   p->pSrc, flags)
bc00: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
bc10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bc20: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
bc30: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
bc40: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
bc50: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
bc60: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
bc70: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
bc80: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
bc90: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
bca0: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
bcb0: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
bcc0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
bcd0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
bce0: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
bcf0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
bd00: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
bd10: 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71  or = pPrior = sq
bd20: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
bd30: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c  b, p->pPrior, fl
bd40: 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ags);.  if( pPri
bd50: 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
bd60: 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
bd70: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
bd80: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
bd90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bda0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
bdb0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
bdc0: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
bdd0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
bde0: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
bdf0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
be00: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
be10: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
be20: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
be30: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
be40: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
be50: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
be60: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
be70: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
be80: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e   = -1;.  pNew->n
be90: 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e  SelectRow = p->n
bea0: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65  SelectRow;.  pNe
beb0: 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44  w->pWith = withD
bec0: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29  up(db, p->pWith)
bed0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
bee0: 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70  tSetName(pNew, p
bef0: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72  ->zSelName);.  r
bf00: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65  eturn pNew;.}.#e
bf10: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
bf20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
bf30: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
bf40: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
bf50: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
bf60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
bf70: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
bf80: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
bf90: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
bfa0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
bfb0: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
bfc0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
bfd0: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
bfe0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
bff0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
c000: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
c010: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
c020: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
c030: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
c040: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
c050: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
c060: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
c070: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
c080: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
c090: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
c0a0: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
c0b0: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
c0c0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
c0d0: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
c0e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c0f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
c100: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
c110: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
c120: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
c130: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
c140: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c150: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
c160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
c170: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
c180: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
c190: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
c1a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c1b0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
c1c0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
c1d0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
c1e0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
c1f0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c200: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
c210: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
c220: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
c230: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
c240: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45   }.    pList->nE
c250: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69  xpr = 0;.    pLi
c260: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  st->a = sqlite3D
c270: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c280: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
c290: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
c2a0: 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74  List->a==0 ) got
c2b0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73  o no_mem;.  }els
c2c0: 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45  e if( (pList->nE
c2d0: 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45  xpr & (pList->nE
c2e0: 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20  xpr-1))==0 ){.  
c2f0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
c300: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
c310: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
c320: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d  xpr>0 );.    a =
c330: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
c340: 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20  c(db, pList->a, 
c350: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73  pList->nExpr*2*s
c360: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
c370: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
c380: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
c390: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
c3a0: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
c3b0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
c3c0: 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69  ist->a!=0 );.  i
c3d0: 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75  f( 1 ){.    stru
c3e0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
c3f0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
c400: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
c410: 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ++];.    memset(
c420: 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
c430: 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70  (*pItem));.    p
c440: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
c450: 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  xpr;.  }.  retur
c460: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
c470: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
c480: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
c490: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
c4a0: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
c4b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
c4c0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
c4d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
c4e0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
c4f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c500: 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20  ** pColumns and 
c510: 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63  pExpr form a vec
c520: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77  tor assignment w
c530: 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
c540: 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73  the SET.** claus
c550: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
c560: 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20  tatement.  Like 
c570: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
c580: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78     (a,b,c) = (ex
c590: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
c5a0: 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c  .** Or:    (a,b,
c5b0: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79  c) = (SELECT x,y
c5c0: 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a  ,z FROM ....).**
c5d0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72  .** For each ter
c5e0: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  m of the vector 
c5f0: 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65  assignment, appe
c600: 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  nd new entries t
c610: 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  o the.** express
c620: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
c630: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
c640: 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  a subquery on th
c650: 65 20 4c 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a  e LHS, append.**
c660: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
c670: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  N expressions..*
c680: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
c690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
c6a0: 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65  dVector(.  Parse
c6b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c6c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c6d0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
c6e0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
c6f0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
c700: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
c710: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
c720: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
c730: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
c740: 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f  f names of LHS o
c750: 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74  f the assignment
c760: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
c770: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
c780: 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  Vector expressio
c790: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
c7a0: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
c7b0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c7c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c7d0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
c7e0: 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   i;.  int iFirst
c7f0: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
c800: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f  ->nExpr : 0;.  /
c810: 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f  * pColumns can o
c820: 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20  nly be NULL due 
c830: 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e  to an OOM but an
c840: 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
c850: 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69  an.  ** exit pri
c860: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
c870: 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  ne being invoked
c880: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
c890: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67  pColumns==0) ) g
c8a0: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
c8b0: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
c8c0: 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76  Expr==0 ) goto v
c8d0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
c8e0: 6f 72 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  or;.  n = sqlite
c8f0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
c900: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 43  pExpr);.  if( pC
c910: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29  olumns->nId!=n )
c920: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c930: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
c940: 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e  d columns assign
c950: 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20  ed %d values",. 
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64     pColumns->nId
c980: 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76  , n);.    goto v
c990: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
c9a0: 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  or;.  }.  for(i=
c9b0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
c9c0: 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72    Expr *pSubExpr
c9d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f   = sqlite3ExprFo
c9e0: 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61  rVectorField(pPa
c9f0: 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a  rse, pExpr, i);.
ca00: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
ca10: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
ca20: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
ca30: 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20   pSubExpr);.    
ca40: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
ca50: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
ca60: 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b  ->nExpr==iFirst+
ca70: 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69  i+1 );.      pLi
ca80: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
ca90: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43  pr-1].zName = pC
caa0: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
cab0: 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d  me;.      pColum
cac0: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ns->a[i].zName =
cad0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
cae0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
caf0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
cb00: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
cb10: 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45  st->a[iFirst].pE
cb20: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  xpr ){.      ass
cb30: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 46  ert( pList->a[iF
cb40: 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  irst].pExpr->op=
cb50: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
cb60: 4e 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  N );.      pList
cb70: 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70  ->a[iFirst].pExp
cb80: 72 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70  r->pRight = pExp
cb90: 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  r;.      pExpr =
cba0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 76   0;.    }.  }..v
cbb0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
cbc0: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  or:.  sqlite3Exp
cbd0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
cbe0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  r);.  sqlite3IdL
cbf0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
cc00: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72  olumns);.  retur
cc10: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
cc20: 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f  * Set the sort o
cc30: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73  rder for the las
cc40: 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65  t element on the
cc50: 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e   given ExprList.
cc60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cc70: 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
cc80: 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70  rder(ExprList *p
cc90: 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72  , int iSortOrder
cca0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
ccb0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
ccc0: 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45  ( SQLITE_SO_UNDE
ccd0: 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54  FINED<0 && SQLIT
cce0: 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53  E_SO_ASC>=0 && S
ccf0: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20  QLITE_SO_DESC>0 
cd00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
cd10: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28  nExpr>0 );.  if(
cd20: 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b   iSortOrder<0 ){
cd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
cd40: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
cd50: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
cd60: 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65  SO_ASC );.    re
cd70: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61  turn;.  }.  p->a
cd80: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
cd90: 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f  tOrder = (u8)iSo
cda0: 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rtOrder;.}../*.*
cdb0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
cdc0: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
cdd0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
cde0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
cdf0: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
ce00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
ce10: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
ce20: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
ce30: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
ce40: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
ce50: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
ce60: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
ce70: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
ce80: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
ce90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
cea0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
ceb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cec0: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
ced0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
cee0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
cef0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cf00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
cf10: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
cf20: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
cf30: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
cf40: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
cf50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
cf60: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
cf70: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cf90: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
cfa0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
cfb0: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
cfc0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
cfd0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
cfe0: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
cff0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d000: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
d010: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
d020: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d030: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
d040: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
d050: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d060: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
d070: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
d080: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
d090: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
d0a0: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
d0b0: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
d0c0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
d0d0: 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74   dequote ) sqlit
d0e0: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
d0f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  >zName);.  }.}..
d100: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
d110: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e  prList.a[].zSpan
d120: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
d130: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
d140: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
d150: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
d160: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
d170: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
d180: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
d190: 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e  rror.  But pSpan
d1a0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
d1b0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
d1c0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
d1d0: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
d1e0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
d1f0: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
d200: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
d210: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
d220: 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Span(.  Parse *p
d230: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d240: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d250: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
d260: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
d270: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
d280: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
d290: 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20  . */.  ExprSpan 
d2a0: 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f  *pSpan         /
d2b0: 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65  * The span to be
d2c0: 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73   added */.){.  s
d2d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d2e0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
d2f0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
d300: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
d310: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
d320: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
d330: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
d340: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
d350: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
d360: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
d370: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
d380: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
d390: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
d3a0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53  pItem->pExpr==pS
d3b0: 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  pan->pExpr );.  
d3c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d3d0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
d3e0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
d3f0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
d400: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
d410: 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c  *)pSpan->zStart,
d420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
d450: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
d460: 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a  zStart));.  }.}.
d470: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
d480: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45  pression list pE
d490: 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  List contains mo
d4a0: 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65  re than iLimit e
d4b0: 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76  lements,.** leav
d4c0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
d4d0: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
d4e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d4f0: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
d500: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d510: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
d520: 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63  EList,.  const c
d530: 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a  har *zObject.){.
d540: 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73    int mx = pPars
d550: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
d560: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
d570: 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  N];.  testcase( 
d580: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
d590: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20  ->nExpr==mx );. 
d5a0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
d5b0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
d5c0: 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66  pr==mx+1 );.  if
d5d0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
d5e0: 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a  st->nExpr>mx ){.
d5f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d600: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
d610: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
d620: 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a   %s", zObject);.
d630: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
d640: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
d650: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
d660: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
d670: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78  NOINLINE void ex
d680: 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73  prListDeleteNN(s
d690: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
d6a0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
d6b0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
d6c0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
d6d0: 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
d6e0: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70  pList->a!=0 || p
d6f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
d700: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
d710: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
d720: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d730: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
d740: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
d750: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
d760: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
d770: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
d780: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
d790: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d7a0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
d7b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
d7c0: 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
d7d0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
d7e0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
d7f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d800: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
d810: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
d820: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
d830: 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74  pList ) exprList
d840: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69  DeleteNN(db, pLi
d850: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
d860: 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65  turn the bitwise
d870: 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e  -OR of all Expr.
d880: 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20  flags fields in 
d890: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70  the given.** Exp
d8a0: 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71  rList..*/.u32 sq
d8b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
d8c0: 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73  gs(const ExprLis
d8d0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
d8e0: 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b   i;.  u32 m = 0;
d8f0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d900: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d910: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d920: 29 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a  ){.       Expr *
d930: 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
d940: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
d950: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
d960: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c  =0 );.       m |
d970: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
d980: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d990: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
d9a0: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
d9b0: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
d9c0: 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  ks used to check
d9d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a   expressions to.
d9e0: 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61  ** see if they a
d9f0: 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f  re "constant" fo
da00: 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f  r some definitio
da10: 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20  n of constant.  
da20: 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43  The.** Walker.eC
da30: 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d  ode value determ
da40: 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ines the type of
da50: 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61   "constant" we a
da60: 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f  re looking.** fo
da70: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  r..**.** These c
da80: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
da90: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
daa0: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
dab0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
dac0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
dad0: 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20  stant()         
dae0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
daf0: 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20  ->eCode==1.**   
db00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
db10: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29  onstantNotJoin()
db20: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
db30: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20  er->eCode==2.** 
db40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
db50: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29  sTableConstant()
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
db70: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a  lker->eCode==3.*
db80: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
db90: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
dba0: 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70  ction()        p
dbb0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
dbc0: 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61   or 5.**.** In a
dbd0: 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  ll cases, the ca
dbe0: 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b  llbacks set Walk
dbf0: 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61  er.eCode=0 and a
dc00: 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72  bort if the expr
dc10: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75  ession.** is fou
dc20: 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63  nd to not be a c
dc30: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
dc40: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  he sqlite3ExprIs
dc50: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
dc60: 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  on() is used for
dc70: 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72   evaluating expr
dc80: 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20  essions.** in a 
dc90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
dca0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c  tement.  The Wal
dcb0: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
dcc0: 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e  is 5 when parsin
dcd0: 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  g.** an existing
dce0: 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68   schema and 4 wh
dcf0: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  en processing a 
dd00: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  new statement.  
dd10: 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  A bound.** param
dd20: 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65  eter raises an e
dd30: 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61  rror for new sta
dd40: 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20  tements, but is 
dd50: 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  silently convert
dd60: 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f  ed.** to NULL fo
dd70: 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  r existing schem
dd80: 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  as.  This allows
dd90: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
dda0: 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63  ables that .** c
ddb0: 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70  ontain a bound p
ddc0: 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65  arameter because
ddd0: 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72   they were gener
dde0: 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65  ated by older ve
ddf0: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
de00: 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64  ite to be parsed
de10: 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
de20: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74  ns of SQLite wit
de30: 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a  hout raising a.*
de40: 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65  * malformed sche
de50: 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  ma error..*/.sta
de60: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
de70: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
de80: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
de90: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
dea0: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  If pWalker->eCod
deb0: 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20  e is 2 then any 
dec0: 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72  term of the expr
ded0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65  ession that come
dee0: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  s from.  ** the 
def0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
df00: 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  ses of a left jo
df10: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
df20: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
df30: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
df40: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
df50: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
df60: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26  lker->eCode==2 &
df70: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
df80: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
df90: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61  Join) ){.    pWa
dfa0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
dfb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
dfc0: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
dfd0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
dfe0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
dff0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
e000: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
e010: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
e020: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
e030: 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65      ** and eithe
e040: 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  r pWalker->eCode
e050: 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20  ==4 or 5 or the 
e060: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65  function has the
e070: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  .    ** SQLITE_F
e080: 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20  UNC_CONST flag. 
e090: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
e0a0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
e0b0: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
e0c0: 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50  e>=4 || ExprHasP
e0d0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50  roperty(pExpr,EP
e0e0: 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20  _ConstFunc) ){. 
e0f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e100: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
e110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e120: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e130: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
e140: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e150: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
e160: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
e170: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
e180: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
e190: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
e1a0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
e1b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e1c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
e1d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e1e0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
e1f0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
e200: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e210: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
e220: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
e230: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e240: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
e250: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  );.      if( pWa
e260: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26  lker->eCode==3 &
e270: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
e280: 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72  =pWalker->u.iCur
e290: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e2a0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
e2b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e2c0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e2d0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e2e0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e2f0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e300: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
e310: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
e320: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b  ker->eCode==5 ){
e330: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  .        /* Sile
e340: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75  ntly convert bou
e350: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  nd parameters th
e360: 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65  at appear inside
e370: 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20   of CREATE.     
e380: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
e390: 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65   into a NULL whe
e3a0: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52  n parsing the CR
e3b0: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
e3c0: 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20  ext out.        
e3d0: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
e3e0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
e3f0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
e400: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
e410: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
e420: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
e430: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
e440: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
e450: 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74  in a CREATE stat
e460: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
e470: 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  nates from.     
e480: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72     ** sqlite3_pr
e490: 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61  epare() causes a
e4a0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
e4b0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e4c0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
e4d0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e4e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
e4f0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
e500: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  /.    default:. 
e510: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e520: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
e530: 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  ECT ); /* select
e540: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
e550: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
e560: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e570: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
e580: 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63  ISTS ); /* selec
e590: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
e5a0: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
e5b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
e5c0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
e5d0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  }.static int sel
e5e0: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e5f0: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
e600: 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  r, Select *NotUs
e610: 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
e620: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
e630: 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  ;.  pWalker->eCo
e640: 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  de = 0;.  return
e650: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
e660: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
e670: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
e680: 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20  t initFlag, int 
e690: 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  iCur){.  Walker 
e6a0: 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
e6b0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
e6c0: 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46   w.eCode = initF
e6d0: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
e6e0: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
e6f0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
e700: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
e710: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
e720: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69  onstant;.  w.u.i
e730: 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71  Cur = iCur;.  sq
e740: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
e750: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
e760: 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
e770: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
e780: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
e790: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
e7a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e7b0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
e7c0: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
e7d0: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
e7e0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
e7f0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
e800: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
e810: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
e820: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
e830: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
e840: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
e850: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
e860: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
e870: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
e880: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
e890: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e8a0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
e8b0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
e8c0: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c  xprIsConst(p, 1,
e8d0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
e8e0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
e8f0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
e900: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
e910: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
e920: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
e930: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
e940: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
e950: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
e960: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
e970: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
e980: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
e990: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
e9a0: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
e9b0: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
e9c0: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
e9d0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
e9e0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
e9f0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
ea00: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20  prIsConst(p, 2, 
ea10: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
ea20: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
ea30: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
ea40: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
ea50: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
ea60: 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20  tant.** for any 
ea70: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
ea80: 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
ea90: 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74  sor iCur.  In ot
eaa0: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a  her words, the.*
eab0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  * expression mus
eac0: 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  t not refer to a
ead0: 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  ny non-determini
eae0: 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  stic function no
eaf0: 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f  r any.** table o
eb00: 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a  ther than iCur..
eb10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
eb20: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
eb30: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
eb40: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  Cur){.  return e
eb50: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c  xprIsConst(p, 3,
eb60: 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iCur);.}../*.**
eb70: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
eb80: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
eb90: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
eba0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ebb0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
ebc0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
ebd0: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
ebe0: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
ebf0: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
ec00: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
ec10: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
ec20: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
ec30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
ec40: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
ec50: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
ec60: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
ec70: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
ec80: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
ec90: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
eca0: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
ecb0: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
ecc0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
ecd0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
ece0: 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
ecf0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
ed00: 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
ed10: 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
ed20: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
ed30: 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
ed40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ed50: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
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 31 20 69 66 20 74 68 65   Return 1 if the
ed90: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
eda0: 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
edb0: 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
edc0: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
edd0: 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
ede0: 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
edf0: 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
ee00: 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
ee10: 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
ee20: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
ee30: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
ee40: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
ee50: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
ee60: 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
ee70: 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  op;.  w.xSelectC
ee80: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
ee90: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
eea0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
eeb0: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
eec0: 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d  rn w.eCode==0;.}
eed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
eee0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
eef0: 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
ef00: 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
ef10: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
ef20: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
ef30: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
ef40: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
ef50: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
ef60: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
ef70: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
ef80: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
ef90: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
efa0: 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
efb0: 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
efc0: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
efd0: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
efe0: 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
eff0: 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
f000: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f010: 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
f020: 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
f030: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a  .  int rc = 0;..
f040: 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
f050: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
f060: 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
f070: 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
f080: 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
f090: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
f0a0: 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
f0b0: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
f0c0: 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
f0d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
f0e0: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
f0f0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
f100: 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
f110: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
f120: 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
f130: 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
f140: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
f150: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
f160: 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
f170: 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
f180: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
f190: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
f1a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
f1b0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
f1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f1d0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
f1e0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
f1f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f200: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
f210: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
f220: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f230: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
f240: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
f250: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
f260: 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
f270: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
f280: 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
f290: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
f2a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f2b0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
f2c0: 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
f2d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f2e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
f2f0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
f300: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
f310: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
f320: 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
f330: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f340: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
f350: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f360: 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
f370: 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
f380: 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
f390: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f3a0: 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
f3b0: 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
f3c0: 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
f3d0: 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
f3e0: 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
f3f0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
f400: 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
f410: 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
f420: 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
f430: 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
f440: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
f450: 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
f460: 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
f470: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
f480: 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
f490: 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
f4a0: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
f4b0: 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
f4c0: 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
f4d0: 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
f4e0: 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
f4f0: 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
f500: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
f510: 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
f520: 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
f530: 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
f540: 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
f550: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
f560: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
f570: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
f580: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
f590: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
f5a0: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
f5b0: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
f5c0: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
f5d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
f5e0: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
f5f0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
f600: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
f610: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
f620: 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
f630: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
f640: 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
f650: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
f660: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
f670: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
f680: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
f690: 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
f6a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61  roperty(p, EP_Ca
f6b0: 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20  nBeNull) ||.    
f6c0: 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f           (p->iCo
f6d0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54  lumn>=0 && p->pT
f6e0: 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c  ab->aCol[p->iCol
f6f0: 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29  umn].notNull==0)
f700: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
f710: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
f720: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
f730: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
f740: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
f750: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
f760: 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
f770: 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
f780: 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
f790: 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
f7a0: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
f7b0: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
f7c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f7d0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
f7e0: 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
f7f0: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
f800: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
f810: 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
f820: 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
f830: 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
f840: 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
f850: 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
f860: 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
f870: 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
f880: 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
f890: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f8a0: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
f8b0: 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
f8c0: 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
f8d0: 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
f8e0: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
f8f0: 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e  FF_BLOB ) return
f900: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
f910: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
f920: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
f930: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
f940: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
f950: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
f960: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
f970: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
f980: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
f990: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
f9a0: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
f9b0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
f9c0: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
f9d0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
f9e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f9f0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
fa00: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
fa10: 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
fa20: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
fa30: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
fa40: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
fa50: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
fa60: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
fa70: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
fa80: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
fa90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
faa0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fab0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
fac0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
fad0: 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
fae0: 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
faf0: 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
fb00: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
fb10: 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
fb20: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
fb30: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
fb40: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
fb50: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
fb60: 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
fb70: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
fb80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
fb90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
fba0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
fbb0: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
fbc0: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
fbd0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
fbe0: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
fbf0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
fc00: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
fc10: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
fc20: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
fc30: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
fc40: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
fc50: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
fc60: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
fc70: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
fc80: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
fc90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
fca0: 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20  * pX is the RHS 
fcb0: 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  of an IN operato
fcc0: 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53  r.  If pX is a S
fcd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
fce0: 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
fcf0: 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20  simplified to a 
fd00: 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63  direct table acc
fd10: 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ess, then return
fd20: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
fd30: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
fd40: 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73  ement.  If pX is
fd50: 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74   not a SELECT st
fd60: 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69  atement,.** or i
fd70: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
fd80: 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  tement needs to 
fd90: 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e  be manifested in
fda0: 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a  to a transient.*
fdb0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  * table, then re
fdc0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69  turn NULL..*/.#i
fdd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fde0: 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
fdf0: 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64  c Select *isCand
fe00: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78  idateForInOpt(Ex
fe10: 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63  pr *pX){.  Selec
fe20: 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  t *p;.  SrcList 
fe30: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
fe40: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
fe50: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
fe60: 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  i;.  if( !ExprHa
fe70: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
fe80: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65  _xIsSelect) ) re
fe90: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  turn 0;  /* Not 
fea0: 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
feb0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
fec0: 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65  rty(pX, EP_VarSe
fed0: 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20  lect)  ) return 
fee0: 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65  0;  /* Correlate
fef0: 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20  d subq */.  p = 
ff00: 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pX->x.pSelect;. 
ff10: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
ff20: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
ff30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
ff40: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
ff50: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
ff60: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
ff70: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
ff80: 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
ff90: 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
ffa0: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
ffb0: 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
ffc0: 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
ffd0: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
ffe0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
fff0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
10000 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
10010 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
10020 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
10030 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
10040 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
10050 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
10060 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
10070 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
10080 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
10090 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
100a0 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
100b0 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
100c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
100d0 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
100e0 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lause */.  asser
100f0 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
10100 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
10110 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65    /* No LIMIT me
10120 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f  ans no OFFSET */
10130 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
10140 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
10160 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
10170 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
10180 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
10190 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
101a0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
101b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
101c0 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
101d0 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
101e0 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
101f0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
10200 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
10210 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
10220 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
10230 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
10240 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61  ->a[0].pTab;.  a
10250 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
10260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
10270 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
10280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
10290 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
102a0 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
102b0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
102c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
102d0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
102e0 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
102f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
10300 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
10310 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
10320 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  !=0 );.  /* All 
10330 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d  SELECT results m
10340 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20  ust be columns. 
10350 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
10360 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
10370 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
10380 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
10390 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
103a0 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
103b0 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
103c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
103d0 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  es->iTable==pSrc
103e0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[0].iCursor )
103f0 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ;  /* Not a corr
10400 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
10410 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
10420 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  p;.}.#endif /* S
10430 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
10440 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
10450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10460 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
10470 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
10480 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
10490 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
104a0 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
104b0 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
104c0 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
104d0 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
104e0 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
104f0 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
10500 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
10510 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
10520 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
10530 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
10540 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
10550 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
10560 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
10570 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
10580 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
10590 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
105a0 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
105b0 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
105c0 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
105d0 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
105e0 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33  addr1;.  sqlite3
105f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10600 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
10610 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  HasNull);.  addr
10620 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10630 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
10640 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43  nd, iCur); VdbeC
10650 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
10660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10670 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
10680 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  ur, 0, regHasNul
10690 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
106a0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
106b0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
106c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
106d0 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69  , "first_entry_i
106e0 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a  n(%d)", iCur));.
106f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10700 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
10710 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
10720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10730 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
10740 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
10750 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
10760 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
10770 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
10780 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
10790 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
107a0 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
107b0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
107c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
107d0 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
107e0 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
107f0 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
10800 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
10810 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
10820 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
10830 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
10840 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
10850 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
10860 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
10870 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
10880 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
10890 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
108a0 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
108b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
108c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
108d0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
108e0 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
108f0 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
10900 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
10910 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
10920 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
10930 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
10940 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
10950 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
10960 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
10970 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
10980 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
10990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
109a0 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
109b0 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
109c0 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
109d0 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
109e0 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
109f0 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
10a00 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
10a10 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
10a20 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
10a30 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
10a40 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
10a50 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
10a60 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
10a70 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
10a80 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
10a90 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
10aa0 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
10ab0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
10ac0 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
10ad0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
10ae0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
10af0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10b00 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
10b10 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
10b20 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
10b30 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
10b40 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
10b50 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
10b60 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
10b70 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
10b80 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
10b90 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
10ba0 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
10bb0 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
10bc0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
10bd0 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
10be0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
10bf0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
10c00 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
10c10 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
10c20 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
10c30 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
10c40 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
10c70 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
10c80 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
10c90 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
10ca0 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
10cb0 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
10cc0 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
10cf0 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
10d00 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
10d10 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
10d20 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
10d30 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
10d40 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
10d50 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
10d60 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
10d70 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
10d80 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
10d90 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
10da0 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
10db0 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
10dc0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
10dd0 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
10de0 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
10df0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
10e00 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
10e10 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
10e20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
10e30 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
10e40 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
10e50 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
10e60 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
10e70 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
10e80 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
10e90 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
10ea0 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
10eb0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61  must contain exa
10ec0 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
10ed0 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
10ee0 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
10ef0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49  N_INDEX_LOOP.  I
10f00 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
10f10 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
10f20 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
10f30 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
10f40 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
10f50 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d   for a.** fast m
10f60 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
10f70 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
10f80 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
10f90 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e  et, the.** IN in
10fa0 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64  dex will be used
10fb0 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
10fc0 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
10fd0 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  RHS of the.** IN
10fe0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
10ff0 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c   When IN_INDEX_L
11000 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64  OOP is used (and
11010 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
11020 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
11030 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
11040 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20  he set members) 
11050 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
11060 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  must not contain
11070 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20   duplicates..** 
11080 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  An epheremal tab
11090 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
110a0 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
110b0 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
110c0 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
110d0 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
110e0 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
110f0 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
11100 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
11110 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
11120 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
11130 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
11140 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
11150 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
11160 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
11170 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
11180 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
11190 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
111a0 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
111b0 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
111c0 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
111d0 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
111e0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
111f0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
11200 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
11210 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
11220 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
11230 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
11240 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
11250 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
11260 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
11270 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
11280 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
11290 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
112a0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
112b0 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
112c0 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
112d0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
112e0 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
112f0 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
11300 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
11310 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
11320 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
11330 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
11340 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
11350 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
11360 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
11370 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
11380 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
11390 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
113a0 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
113b0 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
113c0 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
113d0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
113e0 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
113f0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
11400 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
11410 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
11420 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
11430 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
11440 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
11450 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
11460 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
11470 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
11480 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
11490 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
114a0 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
114b0 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
114c0 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
114d0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
114e0 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
114f0 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
11500 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
11510 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
11520 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
11530 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
11540 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
11550 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
11560 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
11570 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
11580 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
11590 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
115a0 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
115b0 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
115c0 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
115d0 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
115e0 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
115f0 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
11600 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
11610 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
11620 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
11630 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
11640 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
11650 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
11660 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
11670 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
11680 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
11690 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
116a0 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
116b0 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
116c0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
116d0 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
116e0 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
116f0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
11700 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
11710 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
11720 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
11730 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
11740 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
11750 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
11760 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
11770 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
11780 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
11790 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
117a0 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
117b0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
117c0 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
117d0 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
117e0 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
117f0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
11800 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
11810 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
11820 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
11830 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
11840 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
11850 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
11860 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
11870 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
11880 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
11890 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
118a0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
118b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
118c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
118d0 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
118e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
118f0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11900 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
11910 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
11920 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11930 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
11940 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
11950 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
11960 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
11970 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
11980 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
11990 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
119a0 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
119b0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
119c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
119d0 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
119e0 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
119f0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
11a00 4d 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Map             
11a10 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
11a20 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
11a30 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
11a40 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
11a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a70 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
11a80 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
11a90 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
11aa0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ac0 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
11ad0 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
11ae0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
11af0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
11b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11b10 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
11b20 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
11b30 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20  stBeUnique;     
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
11b60 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
11b70 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
11b80 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11b90 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
11ba0 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
11bb0 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
11bc0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
11bd0 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55  _IN );.  mustBeU
11be0 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73  nique = (inFlags
11bf0 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
11c00 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  )!=0;..  /* If t
11c10 68 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49  he RHS of this I
11c20 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  N(...) operator 
11c30 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64  is a SELECT, and
11c40 20 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a   if it matters .
11c50 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
11c60 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72  not the SELECT r
11c70 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e  esult contains N
11c80 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63  ULL values, chec
11c90 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f  k whether.  ** o
11ca0 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63  r not NULL is ac
11cb0 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  tually possible 
11cc0 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20  (it may not be, 
11cd0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65  for example, due
11ce0 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55   .  ** to NOT NU
11cf0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  LL constraints i
11d00 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49  n the schema). I
11d10 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  f no NULL values
11d20 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20   are possible,. 
11d30 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73   ** set prRhsHas
11d40 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65  Null to 0 before
11d50 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f   continuing.  */
11d60 0a 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  .  if( prRhsHasN
11d70 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67  ull && (pX->flag
11d80 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
11d90 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
11da0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
11db0 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65  List = pX->x.pSe
11dc0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
11dd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
11de0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
11df0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
11e00 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
11e10 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
11e20 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  xpr) ) break;.  
11e30 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
11e40 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
11e50 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75        prRhsHasNu
11e60 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
11e70 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
11e80 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
11e90 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
11ea0 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
11eb0 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
11ec0 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
11ed0 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
11ee0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
11ef0 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
11f00 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  l table.  */.  i
11f10 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
11f20 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e  =0 && (p = isCan
11f30 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
11f40 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  X))!=0 ){.    sq
11f50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11f60 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
11f70 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
11f80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
11f90 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
11fc0 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
11fd0 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
12000 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
12010 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  ab */.    ExprLi
12020 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
12030 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
12040 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
12050 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65  nExpr;..    asse
12060 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
12070 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
12080 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
12090 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
120a0 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
120b0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
120c0 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
120d0 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
120e0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
120f0 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
12100 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
12110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12120 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
12130 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
12140 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
12150 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
12160 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43  .pTab;..    /* C
12170 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61  ode an OP_Transa
12180 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62  ction and OP_Tab
12190 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c  leLock for <tabl
121a0 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  e>. */.    iDb =
121b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
121c0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
121d0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
121e0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
121f0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
12200 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  b);.    sqlite3T
12210 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
12220 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
12230 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
12240 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76  );..    assert(v
12250 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65  );  /* sqlite3Ge
12260 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61  tVdbe() has alwa
12270 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ys been previous
12280 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  ly called */.   
12290 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26   if( nExpr==1 &&
122a0 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
122b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
122c0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  {.      /* The "
122d0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77  x IN (SELECT row
122e0 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20  id FROM table)" 
122f0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  case */.      in
12300 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
12310 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
12320 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56  P_Once);.      V
12330 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
12350 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
12360 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
12370 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
12380 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
12390 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20  INDEX_ROWID;..  
123a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
123b0 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
123c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
123d0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
12400 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
12410 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
12420 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20  ity_ok = 1;.    
12430 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
12440 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
12450 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
12460 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
12470 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20  perform each .  
12480 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
12490 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
124a0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
124b0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
124c0 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f  table.      ** o
124d0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
124e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
124f0 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20  f it not, it is 
12500 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a  not possible to.
12510 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79        ** use any
12520 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48   index of the RH
12530 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  S table.  */.   
12540 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
12550 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f  xpr && affinity_
12560 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ok; i++){.      
12570 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
12580 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
12590 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
125a0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
125b0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73  int iCol = pELis
125c0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69  t->a[i].pExpr->i
125d0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
125e0 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71  char idxaff = sq
125f0 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
12600 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43  Affinity(pTab,iC
12610 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c  ol); /* RHS tabl
12620 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  e */.        cha
12630 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74  r cmpaff = sqlit
12640 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
12650 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b  y(pLhs, idxaff);
12660 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12670 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
12680 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20  E_AFF_BLOB );.  
12690 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
126a0 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
126b0 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
126c0 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66     switch( cmpaf
126d0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  f ){.          c
126e0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ase SQLITE_AFF_B
126f0 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20  LOB:.           
12700 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12710 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
12720 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20  F_TEXT:.        
12730 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f      /* sqlite3Co
12740 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20  mpareAffinity() 
12750 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58  only returns TEX
12760 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  T if one side or
12770 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
12780 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f   ** other has no
12790 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68   affinity and th
127a0 65 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20  e other side is 
127b0 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20  TEXT.  Hence,.  
127c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
127d0 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d   only way for cm
127e0 70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20  paff to be TEXT 
127f0 69 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f  is for idxaff to
12800 20 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20   be TEXT.       
12810 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20       ** and for 
12820 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  the term on the 
12830 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f  LHS of the IN to
12840 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74   have no affinit
12850 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  y. */.          
12860 20 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66    assert( idxaff
12870 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
12880 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  T );.           
12890 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
128a0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
128b0 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f         affinity_
128c0 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75  ok = sqlite3IsNu
128d0 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
128e0 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  xaff);.        }
128f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
12900 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  if( affinity_ok 
12910 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
12920 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
12930 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
12940 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68  will work for th
12950 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
12960 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  /.        for(pI
12970 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
12980 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
12990 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  0; pIdx=pIdx->pN
129a0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
129b0 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b  Bitmask colUsed;
129c0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
129d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73   of the index us
129e0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
129f0 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20  Bitmask mCol;   
12a00 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f        /* Mask fo
12a10 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
12a20 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
12a30 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
12a40 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74  umn<nExpr ) cont
12a50 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
12a60 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75  /* Maximum nColu
12a70 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74  mn is BMS-2, not
12a80 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20   BMS-1, so that 
12a90 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20  we can compute. 
12aa0 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d           ** BITM
12ab0 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f  ASK(nExpr) witho
12ac0 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a  ut overflowing *
12ad0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
12ae0 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
12af0 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  umn==BMS-2 );.  
12b00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
12b10 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
12b20 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
12b30 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
12b40 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63  olumn>=BMS-1 ) c
12b50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12b60 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69     if( mustBeUni
12b70 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  que ){.         
12b80 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
12b90 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20  yCol>nExpr.     
12ba0 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d          ||(pIdx-
12bb0 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26  >nColumn>nExpr &
12bc0 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  & !IsUniqueIndex
12bd0 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20 20  (pIdx)).        
12be0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
12bf0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
12c00 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
12c10 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72   not unique over
12c20 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75   the IN RHS colu
12c30 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mns */.         
12c40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
12c50 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  .  .          co
12c60 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20  lUsed = 0;   /* 
12c70 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78  Columns of index
12c80 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a   used so far */.
12c90 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
12ca0 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
12cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
12cc0 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74  pr *pLhs = sqlit
12cd0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
12ce0 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20  expr(pX->pLeft, 
12cf0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
12d00 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c  Expr *pRhs = pEL
12d10 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
12d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c  .            Col
12d30 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
12d40 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
12d50 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
12d60 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20   pLhs, pRhs);.  
12d70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
12d80 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
12d90 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20  assert( pReq!=0 
12da0 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e  || pRhs->iColumn
12db0 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50  ==XN_ROWID || pP
12dc0 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20  arse->nErr );.  
12dd0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
12de0 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29  0; j<nExpr; j++)
12df0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12e00 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
12e10 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f  mn[j]!=pRhs->iCo
12e20 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
12e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
12e40 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43  ssert( pIdx->azC
12e50 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20  oll[j] );.      
12e60 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71          if( pReq
12e70 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
12e80 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d  rICmp(pReq->zNam
12e90 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
12ea0 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  j])!=0 ){.      
12eb0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
12ec0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
12ed0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
12ee0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12f00 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20     if( j==nExpr 
12f10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
12f20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b       mCol = MASK
12f30 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20  BIT(j);.        
12f40 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63      if( mCol & c
12f50 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20  olUsed ) break; 
12f60 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75  /* Each column u
12f70 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  sed only once */
12f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
12f90 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20  Used |= mCol;.  
12fa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69            if( ai
12fb0 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d  Map ) aiMap[i] =
12fc0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   j;.          }.
12fd0 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73    .          ass
12fe0 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c  ert( i==nExpr ||
12ff0 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42   colUsed!=(MASKB
13000 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a  IT(nExpr)-1) );.
13010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f            if( co
13020 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28  lUsed==(MASKBIT(
13030 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20  nExpr)-1) ){.   
13040 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
13050 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
13060 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  nt, that means t
13070 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  he index pIdx is
13080 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20   usable */.     
13090 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
130a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
130b0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
130c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
130d0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
130e0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
130f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13100 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13110 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20 30  OP_Explain, 0, 0
13120 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
13130 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
13140 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49 4e 44  f(db, "USING IND
13150 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45  EX %s FOR IN-OPE
13160 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61  RATOR",pIdx->zNa
13170 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
13180 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a     P4_DYNAMIC);.
13190 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
131a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
131b0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
131c0 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
131d0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
131e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
131f0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
13200 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
13210 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
13220 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
13230 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
13240 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
13250 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
13260 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
13270 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
13280 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
13290 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
132a0 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
132b0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
132c0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
132d0 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
132e0 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  l ){.#ifdef SQLI
132f0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
13300 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
13310 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73           i64 mas
13320 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31  k = (1<<nExpr)-1
13330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13350 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
13360 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
13370 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
13380 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
13390 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
133a0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
133b0 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
133c0 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
133d0 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
133e0 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
133f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13400 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
13410 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c  ullFlag(v, iTab,
13420 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b   *prRhsHasNull);
13430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
13440 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
13450 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13460 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13470 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
13480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
13490 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
134a0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20   indexes */.    
134b0 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61    } /* End if( a
134c0 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a  ffinity_ok ) */.
134d0 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20      } /* End if 
134e0 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64  not an rowid ind
134f0 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64  ex */.  } /* End
13500 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69   attempt to opti
13510 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e  mize using an in
13520 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  dex */..  /* If 
13530 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
13540 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
13550 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
13560 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
13570 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
13580 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
13590 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
135a0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
135b0 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
135c0 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
135d0 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
135e0 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72   not constant or
135f0 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65   has two or fewe
13600 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68  r terms,.  ** th
13610 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72  en it is not wor
13620 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  th creating an e
13630 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
13640 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
13650 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
13660 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
13670 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
13680 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
13690 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
136a0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
136b0 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
136c0 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
136d0 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
136e0 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
136f0 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
13700 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
13710 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
13720 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
13730 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
13740 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
13750 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69   /* Could not fi
13760 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  nd an existing t
13770 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
13780 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20   use as the RHS 
13790 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57  b-tree..    ** W
137a0 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67  e will have to g
137b0 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d  enerate an ephem
137c0 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f  eral table to do
137d0 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f   the job..    */
137e0 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51  .    u32 savedNQ
137f0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
13800 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
13810 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
13820 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79  ull = 0;.    eTy
13830 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50  pe = IN_INDEX_EP
13840 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61  H;.    if( inFla
13850 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
13860 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  OP ){.      pPar
13870 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
13880 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58   0;.      if( pX
13890 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
138a0 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72  <0 && !ExprHasPr
138b0 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
138c0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
138d0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
138e0 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
138f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
13900 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29  ( prRhsHasNull )
13910 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61  {.      *prRhsHa
13920 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65  sNull = rMayHave
13930 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
13940 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  >nMem;.    }.   
13950 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
13960 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
13970 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
13980 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
13990 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72  ROWID);.    pPar
139a0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
139b0 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
139c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
139d0 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
139e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d  ;.  }..  if( aiM
139f0 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  ap && eType!=IN_
13a00 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
13a10 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
13a20 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
13a30 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
13a40 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78     n = sqlite3Ex
13a50 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d  prVectorSize(pX-
13a60 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72  >pLeft);.    for
13a70 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20  (i=0; i<n; i++) 
13a80 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20  aiMap[i] = i;.  
13a90 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
13aa0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
13ab0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13ac0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
13ad0 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
13ae0 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
13af0 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
13b00 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
13b10 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
13b20 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
13b30 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
13b40 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
13b50 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
13b60 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
13b70 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
13b80 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
13b90 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
13ba0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
13bb0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
13bc0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
13bd0 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
13be0 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
13bf0 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
13c00 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
13c10 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
13c20 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
13c30 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
13c40 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
13c50 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
13c60 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
13c70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
13c80 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
13c90 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
13ca0 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
13cb0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
13cc0 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
13cd0 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
13ce0 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
13cf0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
13d00 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
13d10 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
13d20 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
13d30 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20   nVal+1);.  if( 
13d40 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  zRet ){.    int 
13d50 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
13d60 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
13d70 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73      Expr *pA = s
13d80 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
13d90 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
13da0 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61  i);.      char a
13db0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
13dc0 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20  finity(pA);.    
13dd0 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
13de0 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
13df0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
13e00 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63  eAffinity(pSelec
13e10 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
13e20 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20  pExpr, a);.     
13e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13e40 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20  zRet[i] = a;.   
13e50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
13e60 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27  Ret[nVal] = '\0'
13e70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
13e80 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Ret;.}.#endif..#
13e90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ea0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
13eb0 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65  * Load the Parse
13ec0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
13ed0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
13ee0 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72  ment with an err
13ef0 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f  or .** message o
13f00 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
13f10 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20  *   "sub-select 
13f20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e  returns N column
13f30 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a  s - expected M".
13f40 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
13f50 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
13f60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13f70 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74  int nActual, int
13f80 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e   nExpect){.  con
13f90 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20  st char *zFmt = 
13fa0 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
13fb0 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d  rns %d columns -
13fc0 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20   expected %d";. 
13fd0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13fe0 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e  (pParse, zFmt, n
13ff0 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29  Actual, nExpect)
14000 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
14010 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * Expression pEx
14020 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74  pr is a vector t
14030 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65  hat has been use
14040 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77  d in a context w
14050 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  here.** it is no
14060 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20  t permitted. If 
14070 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
14080 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68  elect vector, th
14090 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c  is routine .** l
140a0 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f  oads the Parse o
140b0 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73  bject with a mes
140c0 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  sage of the form
140d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73  :.**.**   "sub-s
140e0 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20  elect returns N 
140f0 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
14100 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ed 1".**.** Or, 
14110 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c  if it is a regul
14120 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72  ar scalar vector
14130 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76  :.**.**   "row v
14140 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f  alue misused".*/
14150 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33     .void sqlite3
14160 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50  VectorErrorMsg(P
14170 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
14180 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e  pr *pExpr){.#ifn
14190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
141a0 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70  SUBQUERY.  if( p
141b0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
141c0 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20  _xIsSelect ){.  
141d0 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
141e0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
141f0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
14200 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
14210 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   1);.  }else.#en
14220 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
14230 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14240 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
14250 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a  isused");.  }.}.
14260 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14270 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
14280 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
14290 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
142a0 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
142b0 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
142c0 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
142d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
142e0 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
142f0 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
14300 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
14310 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
14320 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
14330 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
14340 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
14350 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
14360 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
14370 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
14380 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
14390 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
143a0 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
143b0 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
143c0 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
143d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
143e0 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
143f0 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
14400 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
14410 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
14420 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
14430 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
14440 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
14450 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
14460 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
14470 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
14480 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
14490 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
144a0 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
144b0 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
144c0 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
144d0 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
144e0 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
144f0 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
14500 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
14510 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
14520 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
14530 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
14540 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
14550 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
14560 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
14570 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
14580 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
14590 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
145a0 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
145b0 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
145c0 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
145d0 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
145e0 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
145f0 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
14600 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
14610 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
14620 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
14630 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72  ize the register
14640 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
14650 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c  veNull.** to NUL
14660 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
14670 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63  ines will take c
14680 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
14690 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a  this register.**
146a0 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
146b0 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
146c0 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
146d0 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f  * For a SELECT o
146e0 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
146f0 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  r, return the re
14700 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
14710 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e  s the.** result.
14720 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
14730 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65  lumn SELECT, the
14740 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
14750 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  d in a contiguou
14760 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65  s.** array of re
14770 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
14780 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
14790 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
147a0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
147b0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20   result column. 
147c0 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e   Return 0 for IN
147d0 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
147e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
147f0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
14800 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
14810 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
14820 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
14830 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
14840 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
14850 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
14860 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
14870 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
14880 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
14890 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
148a0 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61   int rHasNullFla
148b0 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  g,       /* Regi
148c0 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
148d0 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
148e0 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
148f0 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
14900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
14910 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
14920 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
14930 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
14940 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
14950 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
14960 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
14970 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
14980 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
14990 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
149b0 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
149c0 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
149d0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
149e0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
149f0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
14a00 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
14a10 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
14a20 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
14a30 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75  ..  /* The evalu
14a40 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f  ation of the IN/
14a50 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
14a60 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
14a70 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
14a80 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
14a90 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
14aa0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
14ab0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
14ac0 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
14ad0 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
14ae0 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
14af0 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
14b00 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
14b10 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
14b20 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
14b30 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
14b40 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
14b50 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
14b60 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
14b70 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
14b80 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
14b90 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
14ba0 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
14bb0 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
14bc0 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
14bd0 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
14be0 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
14bf0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
14c00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14c10 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
14c20 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70  lect) ){.    jmp
14c30 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69  IfDynamic = sqli
14c40 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
14c50 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
14c60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
14c70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14c80 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
14c90 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
14ca0 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61  in==2 ){.    cha
14cb0 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
14cc0 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
14cd0 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73  >db, "EXECUTE %s
14ce0 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  %s SUBQUERY %d",
14cf0 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79  .        jmpIfDy
14d00 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52  namic>=0?"":"COR
14d10 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20  RELATED ",.     
14d20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
14d30 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c  _IN?"LIST":"SCAL
14d40 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61  AR",.        pPa
14d50 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14d60 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  Id.    );.    sq
14d70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14d80 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
14d90 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
14da0 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
14db0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23  _DYNAMIC);.  }.#
14dc0 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28  endif..  switch(
14dd0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
14de0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
14df0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
14e20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
14e30 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
14e40 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
14e50 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
14e60 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20  ; /* the LHS of 
14e70 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
14e80 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  */.      KeyInfo
14e90 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
14ea0 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
14eb0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
14ec0 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20   int nVal;      
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ee0 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70  Size of vector p
14ef0 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20  Left */.      . 
14f00 20 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69       nVal = sqli
14f10 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
14f20 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  e(pLeft);.      
14f30 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
14f40 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a   || nVal==1 );..
14f50 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
14f60 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49   this is an 'x I
14f70 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72  N(SELECT...)' or
14f80 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c   an 'x IN(<exprl
14f90 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20  ist>)'.      ** 
14fa0 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73  expression it is
14fb0 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d   handled the sam
14fc0 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d  e way.  An ephem
14fd0 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  eral table is . 
14fe0 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
14ff0 69 74 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72  ith index keys r
15000 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
15010 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
15020 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43   .      ** SELEC
15030 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69  T or the <exprli
15040 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  st>..      **.  
15050 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78      ** If the 'x
15060 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ' expression is 
15070 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
15080 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
15090 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
150a0 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
150b0 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
150c0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
150d0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
150e0 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f  olumn is used to
150f0 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78   build the index
15100 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27   keys. If both '
15110 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  x' and the.     
15120 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74   ** SELECT... st
15130 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
15140 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
15150 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
15160 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65  ed.      ** if e
15170 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73  ither column has
15180 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45   NUMERIC or INTE
15190 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66  GER affinity. If
151a0 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a   neither.      *
151b0 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45  * 'x' nor the SE
151c0 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
151d0 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
151e0 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
151f0 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73  nity.      ** is
15200 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
15210 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
15220 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
15230 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
15240 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15250 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
15260 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20  phemeral, .     
15270 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
15280 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e  le, (isRowid?0:n
15290 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65  Val));.      pKe
152a0 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20  yInfo = isRowid 
152b0 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79  ? 0 : sqlite3Key
152c0 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
152d0 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a  ->db, nVal, 1);.
152e0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
152f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15300 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
15310 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
15320 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
15330 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
15340 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
15350 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
15360 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
15370 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
15380 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
15390 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
153a0 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
153b0 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
153c0 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
153d0 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
153e0 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72  *pSelect = pExpr
153f0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
15400 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
15410 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
15420 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  >pEList;..      
15430 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
15440 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  id );.        /*
15450 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20   If the LHS and 
15460 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
15470 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61  erator do not ma
15480 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20  tch, that.      
15490 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20    ** error will 
154a0 68 61 76 65 20 62 65 65 6e 20 63 61 75 67 68 74  have been caught
154b0 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20   long before we 
154c0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
154d0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
154e0 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e   ALWAYS(pEList->
154f0 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a  nExpr==nVal) ){.
15500 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
15510 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
15520 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
15530 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
15540 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
15550 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
15560 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
15570 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53        dest.zAffS
15580 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69  dst = exprINAffi
15590 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
155a0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pr);.          a
155b0 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
155c0 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
155d0 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
155e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   );.          pS
155f0 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
15600 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  0;.          tes
15610 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e  tcase( pSelect->
15620 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
15630 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
15640 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
15650 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20  eyInfo==0 ); /* 
15660 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e  Caused by OOM in
15670 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
15680 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20  lloc() */.      
15690 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
156a0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
156b0 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
156c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
156d0 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
156e0 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
156f0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Sdst);.         
15700 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
15710 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
15720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
15730 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
15740 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
15750 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
15760 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
15770 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  fSdst);.        
15780 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
15790 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20  fo!=0 ); /* OOM 
157a0 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20  will cause exit 
157b0 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c  after sqlite3Sel
157c0 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  ect() */.       
157d0 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
157e0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
157f0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
15800 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
15810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
15820 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
15830 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
15840 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
15850 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
15860 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15870 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
15880 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
15890 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
158a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4b  ;.            pK
158b0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
158c0 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
158d0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a  CompareCollSeq(.
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
15900 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20  t->a[i].pExpr.  
15910 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
15920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15930 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
15940 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
15950 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
15960 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
15970 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
15980 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
15990 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
159a0 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
159b0 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
159c0 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
159d0 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
159e0 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
159f0 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
15a00 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
15a10 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
15a20 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
15a30 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
15a40 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
15a50 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
15a60 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
15a70 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
15a80 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
15a90 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
15aa0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
15ab0 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
15ac0 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
15ad0 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
15ae0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
15af0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
15b00 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
15b10 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
15b20 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
15b30 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
15b40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
15b50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
15b60 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
15b70 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
15b80 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
15b90 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  y(pLeft);.      
15ba0 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
15bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  ){.          aff
15bc0 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
15bd0 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
15be0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
15bf0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
15c00 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
15c10 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
15c20 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
15c30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b   );.          pK
15c40 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
15c50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15c60 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
15c70 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
15c80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
15c90 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
15ca0 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
15cb0 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
15cc0 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
15cd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
15ce0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15cf0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
15d00 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15d10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
15d20 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56  Rowid ) sqlite3V
15d30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15d40 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20  Null, 0, r2);.  
15d50 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
15d60 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
15d70 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
15d80 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
15d90 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
15da0 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
15db0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
15dc0 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
15dd0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
15de0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
15df0 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
15e00 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
15e10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
15e20 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
15e30 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
15e40 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
15e50 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
15e60 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
15e70 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
15e80 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
15e90 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
15ea0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
15eb0 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
15ec0 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
15ed0 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
15ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15ef0 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61     if( jmpIfDyna
15f00 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74  mic>=0 && !sqlit
15f10 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
15f20 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
15f30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15f40 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
15f50 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20  jmpIfDynamic);. 
15f60 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66             jmpIf
15f70 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20  Dynamic = -1;.  
15f80 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
15f90 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
15fa0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15fb0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
15fc0 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
15fd0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
15fe0 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71  f( isRowid && sq
15ff0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
16000 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49  er(pE2, &iValToI
16010 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ns) ){.         
16020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16030 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
16040 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  tInt, pExpr->iTa
16050 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49  ble, r2, iValToI
16060 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ns);.          }
16070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16080 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78    r3 = sqlite3Ex
16090 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
160a0 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
160b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
160c0 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
160d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
160e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
160f0 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20  MustBeInt, r3,. 
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
16120 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16130 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20  tAddr(v)+2);.   
16140 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
16150 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16160 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16170 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16180 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  P_Insert, pExpr-
16190 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29  >iTable, r2, r3)
161a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
161b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
161c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
161d0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
161e0 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32  ecord, r3, 1, r2
161f0 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
16200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
16210 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
16220 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
16230 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20  arse, r3, 1);.  
16240 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16250 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
16260 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
16270 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
16280 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20   r2, r3, 1);.   
16290 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
162a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
162b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
162c0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
162d0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
162e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
162f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16300 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
16310 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
16320 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
16330 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
16340 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
16350 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
16360 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
16370 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16380 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
16390 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
163a0 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
163b0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
163c0 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20    /* Case 3:    
163d0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
163e0 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20   ...).      **  
163f0 20 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53     or:    EXISTS
16400 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
16410 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20   ...).      **. 
16420 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45       ** For a SE
16430 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63  LECT, generate c
16440 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76  ode to put the v
16450 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  alues for all co
16460 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a  lumns of.      *
16470 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  * the first row 
16480 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
16490 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72   registers and r
164a0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
164b0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
164c0 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a  first register..
164d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
164e0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
164f0 45 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e  EXISTS, write an
16500 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20   integer 0 (not 
16510 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78  exists) or 1 (ex
16520 69 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69  ists).      ** i
16530 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
16540 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72  nd return that r
16550 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a  egister number..
16560 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16570 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c  * In both cases,
16580 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75   the query is au
16590 67 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49  gmented with "LI
165a0 4d 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20  MIT 1".  Any .  
165b0 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
165c0 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63  ng limit is disc
165d0 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f  arded in place o
165e0 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20  f the new LIMIT 
165f0 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  1..      */.    
16600 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16620 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
16630 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
16640 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
16650 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16670 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
16680 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20  eal with SELECT 
16690 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
166a0 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166c0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
166d0 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
166e0 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
166f0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
16700 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
16710 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
16720 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
16730 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16740 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
16750 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
16760 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
16770 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
16780 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16790 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
167a0 63 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53  ct) );..      pS
167b0 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
167c0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65  elect;.      nRe
167d0 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  g = pExpr->op==T
167e0 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d  K_SELECT ? pSel-
167f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  >pEList->nExpr :
16800 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
16810 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
16820 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65  &dest, 0, pParse
16830 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20  ->nMem+1);.     
16840 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
16850 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28   nReg;.      if(
16860 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
16870 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
16880 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
16890 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64  T_Mem;.        d
168a0 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74  est.iSdst = dest
168b0 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
168c0 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e    dest.nSdst = n
168d0 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Reg;.        sql
168e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
168f0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
16900 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74  st.iSDParm, dest
16910 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29  .iSDParm+nReg-1)
16920 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16930 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
16940 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
16950 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
16960 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
16970 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
16980 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16990 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
169a0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
169b0 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
169c0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
169d0 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
169e0 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
169f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16a00 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
16a10 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
16a20 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
16a30 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
16a40 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
16a50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54  arse->db, TK_INT
16a60 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 20 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33          &sqlite3
16a90 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29  IntTokens[1], 0)
16aa0 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
16ab0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
16ac0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
16ad0 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65  = ~SF_MultiValue
16ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
16af0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16b00 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
16b10 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16b20 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16b30 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
16b40 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
16b50 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
16b60 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
16b70 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
16b80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
16b90 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20  f( rHasNullFlag 
16ba0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
16bb0 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
16bc0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
16bd0 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20  HasNullFlag);.  
16be0 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79  }..  if( jmpIfDy
16bf0 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20  namic>=0 ){.    
16c00 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
16c10 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  ere(v, jmpIfDyna
16c20 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mic);.  }.  sqli
16c30 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
16c40 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75  pParse);..  retu
16c50 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
16c60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16c70 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
16c80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16c90 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
16ca0 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20   Expr pIn is an 
16cb0 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
16cc0 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
16cd0 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  n checks that th
16ce0 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
16cf0 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
16d00 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72  he IN() operator
16d10 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75   has the same nu
16d20 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75  mber of .** colu
16d30 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f  mns as the vecto
16d40 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72  r on the LHS. Or
16d50 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  , if the RHS of 
16d60 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20  the IN() is not 
16d70 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c  .** a sub-query,
16d80 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73   that the LHS is
16d90 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a   a vector of siz
16da0 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 1..*/.int sqli
16db0 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50  te3ExprCheckIN(P
16dc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
16dd0 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20  pr *pIn){.  int 
16de0 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
16df0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
16e00 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  pIn->pLeft);.  i
16e10 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26  f( (pIn->flags &
16e20 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
16e30 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f  {.    if( nVecto
16e40 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  r!=pIn->x.pSelec
16e50 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
16e60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16e70 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
16e80 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70  pParse, pIn->x.p
16e90 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
16ea0 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b  nExpr, nVector);
16eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
16ec0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
16ed0 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b  f( nVector!=1 ){
16ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74  .    sqlite3Vect
16ef0 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  orErrorMsg(pPars
16f00 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  e, pIn->pLeft);.
16f10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
16f20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
16f30 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
16f40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16f50 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
16f60 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
16f70 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
16f80 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
16f90 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
16fa0 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
16fb0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
16fc0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
16fd0 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
16fe0 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
16ff0 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
17000 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
17010 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
17020 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
17030 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
17040 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
17050 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
17060 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
17070 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
17080 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
17090 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
170a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
170b0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
170c0 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
170d0 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
170e0 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
170f0 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
17100 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
17110 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
17120 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
17130 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
17140 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
17150 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
17160 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
17170 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
17180 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
17190 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
171a0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
171b0 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
171c0 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
171d0 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
171e0 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
171f0 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
17200 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17210 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
17220 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
17230 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
17240 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
17250 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
17260 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
17270 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
17280 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
17290 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
172a0 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
172b0 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
172c0 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
172d0 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
172e0 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
172f0 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
17300 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
17310 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
17320 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
17330 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
17340 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
17350 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
17360 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
17370 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
17380 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
17390 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
173a0 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
173b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
173c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
173d0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
173e0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
173f0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
17400 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
17410 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
17420 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
17430 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
17440 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
17450 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
17460 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
17470 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
17480 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
17490 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
174a0 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
174b0 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
174c0 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
174d0 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
174e0 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
174f0 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
17500 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
17510 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
17520 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
17530 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
17540 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
17550 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
17560 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
17570 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
17580 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
17590 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
175a0 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
175b0 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
175c0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
175d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
175e0 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
175f0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
17600 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
17610 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
17620 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
17630 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
17640 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
17650 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
17660 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
17670 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
17680 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
17690 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
176a0 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
176b0 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
176c0 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
176d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
176e0 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
176f0 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
17700 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
17710 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
17720 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
17730 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
17740 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17750 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
17760 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
17770 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
17780 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
17790 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
177a0 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
177b0 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
177c0 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
177d0 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
177e0 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
177f0 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
17800 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
17810 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
17820 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
17830 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
17840 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
17850 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
17860 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
17870 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
17880 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
17890 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
178a0 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
178b0 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66  loop */ ..  pLef
178c0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
178d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
178e0 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73  xprCheckIN(pPars
178f0 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75  e, pExpr) ) retu
17900 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70  rn;.  zAff = exp
17910 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
17920 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56  se, pExpr);.  nV
17930 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
17940 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
17950 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61  xpr->pLeft);.  a
17960 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c  iMap = (int*)sql
17970 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
17980 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  (.      pParse->
17990 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a  db, nVector*(siz
179a0 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
179b0 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29  f(char)) + 1.  )
179c0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
179d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
179e0 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45   ) goto sqlite3E
179f0 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
17a00 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ror;..  /* Attem
17a10 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  pt to compute th
17a20 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69  e RHS. After thi
17a30 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68  s step, if anyth
17a40 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20  ing other than. 
17a50 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   ** IN_INDEX_NOO
17a60 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  P is returned, t
17a70 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20  he table opened 
17a80 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72  ith cursor pExpr
17a90 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63  ->iTable .  ** c
17aa0 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
17ab0 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
17ac0 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49  the RHS. If IN_I
17ad0 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
17ae0 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  urned,.  ** the 
17af0 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20  RHS has not yet 
17b00 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a  been coded.  */.
17b10 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
17b20 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
17b30 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
17b40 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
17b50 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
17b60 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
17b70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
17b80 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
17b90 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
17ba0 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
17bb0 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bd0 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
17be0 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
17bf0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
17c20 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
17c30 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
17c40 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b  HasNull, aiMap);
17c50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
17c60 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63  se->nErr || nVec
17c70 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d  tor==1 || eType=
17c80 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20  =IN_INDEX_EPH.  
17c90 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49       || eType==I
17ca0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
17cb0 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  C || eType==IN_I
17cc0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
17cd0 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  .  );.#ifdef SQL
17ce0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43  ITE_DEBUG.  /* C
17cf0 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61  onfirm that aiMa
17d00 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65  p[] contains nVe
17d10 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c  ctor integer val
17d20 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ues between 0 an
17d30 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31  d.  ** nVector-1
17d40 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
17d50 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
17d60 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b  .    int j, cnt;
17d70 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30  .    for(cnt=j=0
17d80 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b  ; j<nVector; j++
17d90 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d  ) if( aiMap[j]==
17da0 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61  i ) cnt++;.    a
17db0 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b  ssert( cnt==1 );
17dc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17dd0 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
17de0 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
17df0 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
17e00 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  ". If the LHS is
17e10 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c   a .  ** vector,
17e20 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72   then it is stor
17e30 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ed in an array o
17e40 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74  f nVector regist
17e50 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20  ers starting .  
17e60 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20  ** at r1..  **. 
17e70 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49   ** sqlite3FindI
17e80 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68  nIndex() might h
17e90 61 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68  ave reordered th
17ea0 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
17eb0 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20  LHS vector.  ** 
17ec0 73 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c  so that the fiel
17ed0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61  ds are in the sa
17ee0 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65  me order as an e
17ef0 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20  xisting index.  
17f00 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b   The.  ** aiMap[
17f10 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
17f20 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20   a mapping from 
17f30 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53  the original LHS
17f40 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a   field order to.
17f50 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f    ** the field o
17f60 72 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65  rder that matche
17f70 73 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e  s the RHS index.
17f80 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
17f90 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
17fa0 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67  rse);.  rLhsOrig
17fb0 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f   = exprCodeVecto
17fc0 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
17fd0 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72   &iDummy);.  for
17fe0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20  (i=0; i<nVector 
17ff0 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20  && aiMap[i]==i; 
18000 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48  i++){} /* Are LH
18010 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72  S fields reorder
18020 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d  ed? */.  if( i==
18030 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f  nVector ){.    /
18040 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65  * LHS fields are
18050 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a   not reordered *
18060 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68  /.    rLhs = rLh
18070 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  sOrig;.  }else{.
18080 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
18090 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66  eorder the LHS f
180a0 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20  ields according 
180b0 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20  to aiMap */.    
180c0 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65  rLhs = sqlite3Ge
180d0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
180e0 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  e, nVector);.   
180f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
18100 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tor; i++){.     
18110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18120 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
18130 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b  LhsOrig+i, rLhs+
18140 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20  aiMap[i], 0);.  
18150 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
18160 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
18170 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69  dex() did not fi
18180 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20  nd or create an 
18190 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20  index that is.  
181a0 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
181b0 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49  evaluating the I
181c0 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e  N operator, then
181d0 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20   evaluate using 
181e0 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20  a.  ** sequence 
181f0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
18200 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
18210 73 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68  s step (1) in th
18220 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64  e in-operator.md
18230 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72   optimized algor
18240 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ithm..  */.  if(
18250 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
18260 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70  _NOOP ){.    Exp
18270 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
18280 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
18290 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
182a0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
182b0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
182c0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
182d0 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20    int labelOk = 
182e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
182f0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
18300 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a   r2, regToFree;.
18310 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c      int regCkNul
18320 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
18330 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  i;.    assert( !
18340 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18350 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
18360 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
18370 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
18380 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
18390 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
183a0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
183b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
183c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
183d0 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
183e0 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
183f0 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
18400 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69  for(ii=0; ii<pLi
18410 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  st->nExpr; ii++)
18420 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  {.      r2 = sql
18430 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
18440 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
18450 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65  a[ii].pExpr, &re
18460 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  gToFree);.      
18470 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26  if( regCkNull &&
18480 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
18490 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69  eNull(pList->a[i
184a0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
184b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
184c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
184d0 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  And, regCkNull, 
184e0 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r2, regCkNull);.
184f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18500 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ( ii<pList->nExp
18510 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c  r-1 || destIfNul
18520 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
18530 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18540 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18550 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65  P_Eq, rLhs, labe
18560 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lOk, r2,.       
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18580 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
18590 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
185a0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
185b0 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74  geIf(v, ii<pList
185c0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
185d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
185e0 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d  If(v, ii==pList-
185f0 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
18600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
18610 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
18620 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
18630 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18640 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
18650 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20  tIfFalse );.    
18660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18670 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
18680 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73  rLhs, destIfFals
18690 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  e, r2,.         
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186b0 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
186c0 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65  4_COLLSEQ); Vdbe
186d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
186e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
186f0 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
18700 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  [0] | SQLITE_JUM
18710 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
18720 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
18730 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18740 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29  arse, regToFree)
18750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18760 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20  regCkNull ){.   
18770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18780 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
18790 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65  l, regCkNull, de
187a0 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
187b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
187c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
187d0 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
187e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
187f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18800 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29  abel(v, labelOk)
18810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
18820 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18830 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  se, regCkNull);.
18840 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
18850 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
18860 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  hed;.  }..  /* S
18870 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20  tep 2: Check to 
18880 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63  see if the LHS c
18890 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
188a0 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68   columns.  If th
188b0 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20  e.  ** LHS does 
188c0 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68  contain NULLs th
188d0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
188e0 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c  st be either FAL
188f0 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  SE or NULL..  **
18900 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b   We will then sk
18910 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  ip the binary se
18920 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e  arch of the RHS.
18930 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
18940 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
18950 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53  lse ){.    destS
18960 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c  tep2 = destIfFal
18970 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  se;.  }else{.   
18980 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
18990 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33  tStep6 = sqlite3
189a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
189b0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
189c0 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
189d0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
189e0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
189f0 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d  ldSubexpr(pExpr-
18a00 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
18a10 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
18a20 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
18a30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18a40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
18a50 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  ull, rLhs+i, des
18a60 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56  tStep2);.      V
18a70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18a80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18a90 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53  Step 3.  The LHS
18aa0 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f   is now known to
18ab0 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44   be non-NULL.  D
18ac0 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
18ad0 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  rch.  ** of the 
18ae0 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48  RHS using the LH
18af0 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49  S as a probe.  I
18b00 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73  f found, the res
18b10 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65  ult is.  ** true
18b20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
18b30 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
18b40 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  ID ){.    /* In 
18b50 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
18b60 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
18b70 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  of table b-tree 
18b80 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20  and so we also. 
18b90 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20     ** know that 
18ba0 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e  the RHS is non-N
18bb0 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ULL.  Hence, we 
18bc0 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20  combine steps 3 
18bd0 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74  and 4.    ** int
18be0 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
18bf0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
18c00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18c10 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78  P_SeekRowid, pEx
18c20 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
18c30 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a  IfFalse, rLhs);.
18c40 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18c50 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75  (v);.    addrTru
18c60 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
18c70 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
18c80 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e  oto);  /* Return
18c90 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   True */.  }else
18ca0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18cb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
18cc0 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56  finity, rLhs, nV
18cd0 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20  ector, 0, zAff, 
18ce0 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  nVector);.    if
18cf0 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
18d00 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  estIfNull ){.   
18d10 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74     /* Combine St
18d20 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35 20  ep 3 and Step 5 
18d30 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
18d40 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  code */.      sq
18d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
18d60 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
18d70 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
18d80 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20  , destIfFalse,. 
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18da0 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
18db0 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
18dc0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18dd0 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
18de0 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
18df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f  ;.    }.    /* O
18e00 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20  rdinary Step 3, 
18e10 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
18e20 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c  re FALSE and NUL
18e30 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  L are distinct *
18e40 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  /.    addrTruthO
18e50 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
18e60 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
18e70 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
18e80 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ble, 0,.        
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
18eb0 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
18ec0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18ed0 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e   }..  /* Step 4.
18ee0 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20    If the RHS is 
18ef0 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
18f00 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20  NULL and we did 
18f10 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e  not find.  ** an
18f20 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65   match on the se
18f30 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e  arch above, then
18f40 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
18f50 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a   be FALSE..  */.
18f60 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c    if( rRhsHasNul
18f70 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20  l && nVector==1 
18f80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
18f90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
18fa0 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  otNull, rRhsHasN
18fb0 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ull, destIfFalse
18fc0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
18fd0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
18fe0 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20 77 65  * Step 5.  If we
18ff0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
19000 75 74 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ut the differenc
19010 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61  e between NULL a
19020 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74  nd.  ** FALSE, t
19030 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
19040 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69  false. .  */.  i
19050 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  f( destIfFalse==
19060 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c  destIfNull ) sql
19070 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
19080 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20  destIfFalse);.. 
19090 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70   /* Step 6: Loop
190a0 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66   through rows of
190b0 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61   the RHS.  Compa
190c0 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74  re each row to t
190d0 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20  he LHS..  ** If 
190e0 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  any comparison i
190f0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
19100 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
19110 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f    If all.  ** co
19120 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41  mparisons are FA
19130 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e  LSE then the fin
19140 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c  al result is FAL
19150 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  SE..  **.  ** Fo
19160 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20  r a scalar LHS, 
19170 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  it is sufficient
19180 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74   to check just t
19190 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a  he first row.  *
191a0 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20  * of the RHS..  
191b0 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74 65  */.  if( destSte
191c0 70 36 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  p6 ) sqlite3Vdbe
191d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
191e0 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64  destStep6);.  ad
191f0 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
19200 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19210 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
19220 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
19230 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  se);.  VdbeCover
19240 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56  age(v);.  if( nV
19250 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64  ector>1 ){.    d
19260 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c  estNotNull = sql
19270 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
19280 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l(v);.  }else{. 
19290 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f     /* For nVecto
192a0 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74  r==1, combine st
192b0 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69  eps 6 and 7 by i
192c0 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
192d0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53  ning.    ** FALS
192e0 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63  E if the first c
192f0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
19300 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73   NULL */.    des
19310 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49  tNotNull = destI
19320 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f  fFalse;.  }.  fo
19330 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
19340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
19350 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71   *p;.    CollSeq
19360 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pColl;.    int
19370 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
19380 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
19390 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
193a0 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
193b0 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
193c0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
193d0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
193e0 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c  rse, p);.    sql
193f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19400 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78  , OP_Column, pEx
19410 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72  pr->iTable, i, r
19420 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
19430 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19440 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74  Ne, rLhs+i, dest
19450 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20  NotNull, r3,.   
19460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19470 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
19480 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
19490 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
194a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
194b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
194c0 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20  rse, r3);.  }.  
194d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
194e0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
194f0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
19500 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b  if( nVector>1 ){
19510 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19520 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19530 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20  destNotNull);.  
19540 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19550 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
19560 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
19570 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56  ddrTop+1);.    V
19580 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19590 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20  .    /* Step 7: 
195a0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
195b0 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
195c0 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
195d0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
195e0 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71  false. */.    sq
195f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19600 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
19610 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d  estIfFalse);.  }
19620 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72  ..  /* Jumps her
19630 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  e in order to re
19640 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20  turn true. */.  
19650 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
19660 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68  ere(v, addrTruth
19670 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70  Op);..sqlite3Exp
19680 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
19690 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c  :.  if( rLhs!=rL
196a0 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33  hsOrig ) sqlite3
196b0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
196c0 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  Parse, rLhs);.  
196d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
196e0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56  Pop(pParse);.  V
196f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19700 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
19710 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
19720 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73  N_oom_error:.  s
19730 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
19740 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
19750 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19760 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
19770 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  f);.}.#endif /* 
19780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19790 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
197a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
197b0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
197c0 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
197d0 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
197e0 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
197f0 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
19800 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
19810 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
19820 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
19830 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
19840 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
19850 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
19860 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
19870 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
19880 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
19890 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
198a0 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
198b0 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
198c0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
198d0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
198e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
198f0 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
19900 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
19910 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
19920 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
19930 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
19940 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
19950 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
19960 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
19970 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
19980 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
19990 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
199a0 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
199b0 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
199c0 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
199d0 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
199e0 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
199f0 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
19a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19a10 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61  p4Dup8(v, OP_Rea
19a20 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  l, 0, iMem, 0, (
19a30 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52  u8*)&value, P4_R
19a40 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
19a50 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
19a60 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
19a70 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
19a80 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
19a90 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
19aa0 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
19ab0 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
19ac0 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
19ad0 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
19ae0 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
19af0 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
19b00 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
19b10 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
19b20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
19b30 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
19b40 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
19b50 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19b60 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
19b70 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
19b80 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
19b90 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
19ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
19bb0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
19bc0 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
19bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19be0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19bf0 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
19c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
19c10 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
19c20 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
19c30 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
19c40 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
19c50 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
19c60 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48   = sqlite3DecOrH
19c70 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75  exToI64(z, &valu
19c80 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 31  e);.    if( c==1
19c90 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 21 6e 65   || (c==2 && !ne
19ca0 67 46 6c 61 67 29 20 7c 7c 20 28 6e 65 67 46 6c  gFlag) || (negFl
19cb0 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41  ag && value==SMA
19cc0 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23  LLEST_INT64)){.#
19cd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
19ce0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
19cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
19d00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19d10 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
19d20 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
19d30 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
19d40 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20  ;.#else.#ifndef 
19d50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f  SQLITE_OMIT_HEX_
19d60 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66  INTEGER.      if
19d70 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
19d80 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20  mp(z,"0x",2)==0 
19d90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19da0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19db0 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20  e, "hex literal 
19dc0 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20  too big: %s%s", 
19dd0 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a  negFlag?"-":"",z
19de0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
19df0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
19e00 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
19e10 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
19e20 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
19e30 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
19e40 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
19e50 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
19e60 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
19e70 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
19e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19e90 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
19ea0 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
19eb0 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
19ec0 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
19ed0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
19ee0 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65  ase column-cache
19ef0 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 20 69 0a   entry number i.
19f00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
19f10 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
19f20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
19f30 74 20 69 29 7b 0a 20 20 69 66 28 20 70 50 61 72  t i){.  if( pPar
19f40 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
19f50 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  .tempReg ){.    
19f60 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
19f70 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
19f80 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
19f90 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
19fa0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
19fb0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
19fc0 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
19fd0 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
19fe0 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
19ff0 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69  nColCache--;.  i
1a000 66 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  f( i<pParse->nCo
1a010 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 70 50  lCache ){.    pP
1a020 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1a030 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  i] = pParse->aCo
1a040 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e  lCache[pParse->n
1a050 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d  ColCache];.  }.}
1a060 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  .../*.** Record 
1a070 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  in the column ca
1a080 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69  che that a parti
1a090 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f  cular column fro
1a0a0 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  m a.** particula
1a0b0 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65  r table is store
1a0c0 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
1a0d0 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76  r register..*/.v
1a0e0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1a0f0 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20  acheStore(Parse 
1a100 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
1a110 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  b, int iCol, int
1a120 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
1a130 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20  .  int minLru;. 
1a140 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73   int idxLru;.  s
1a150 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1a160 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p;..  /* Unless
1a170 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
1a180 63 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72  curred, register
1a190 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77   numbers are alw
1a1a0 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f  ays positive. */
1a1b0 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e  .  assert( iReg>
1a1c0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
1a1d0 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
1a1e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1a1f0 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
1a200 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36  =-1 && iCol<3276
1a210 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20  8 );  /* Finite 
1a220 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  column numbers *
1a230 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49  /..  /* The SQLI
1a240 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66  TE_ColumnCache f
1a250 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65  lag disables the
1a260 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20   column cache.  
1a270 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a  This is used.  *
1a280 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e  * for testing on
1a290 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74  ly - to verify t
1a2a0 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79  hat SQLite alway
1a2b0 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20  s gets the same 
1a2c0 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68  answer.  ** with
1a2d0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65   and without the
1a2e0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
1a2f0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
1a300 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70  zationDisabled(p
1a310 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
1a320 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29  E_ColumnCache) )
1a330 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46   return;..  /* F
1a340 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79  irst replace any
1a350 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e   existing entry.
1a360 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
1a370 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65  lly, the way the
1a380 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73   column cache is
1a390 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c   currently used,
1a3a0 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65   we are guarante
1a3b0 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ed.  ** that the
1a3c0 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76   object will nev
1a3d0 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e  er already be in
1a3e0 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20   cache.  Verify 
1a3f0 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a  this guarantee..
1a400 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
1a410 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  BUG.  for(i=0, p
1a420 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1a430 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1a440 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1a450 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1a460 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
1a470 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
1a480 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
1a490 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  f..  /* If the c
1a4a0 61 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20  ache is already 
1a4b0 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65  full, delete the
1a4c0 20 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20   least recently 
1a4d0 75 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20  used entry */.  
1a4e0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  if( pParse->nCol
1a4f0 43 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f  Cache>=SQLITE_N_
1a500 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20  COLCACHE ){.    
1a510 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
1a520 66 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20  fff;.    idxLru 
1a530 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = -1;.    for(i=
1a540 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1a550 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1a560 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1a570 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
1a580 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
1a590 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72  ){.        idxLr
1a5a0 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d  u = i;.        m
1a5b0 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
1a5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a5d0 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1a5e0 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
1a5f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a600 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1a610 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43  Cache[pParse->nC
1a620 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a  olCache++];.  }.
1a630 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65  .  /* Add the ne
1a640 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65  w entry to the e
1a650 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  nd of the cache 
1a660 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  */.  p->iLevel =
1a670 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1a680 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  evel;.  p->iTabl
1a690 65 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69  e = iTab;.  p->i
1a6a0 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
1a6b0 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
1a6c0 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20  .  p->tempReg = 
1a6d0 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50  0;.  p->lru = pP
1a6e0 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
1a6f0 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  +;.}../*.** Indi
1a700 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74  cate that regist
1a710 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67  ers between iReg
1a720 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72  ..iReg+nReg-1 ar
1a730 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
1a740 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68  ten..** Purge th
1a750 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  e range of regis
1a760 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  ters from the co
1a770 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76  lumn cache..*/.v
1a780 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1a790 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65  acheRemove(Parse
1a7a0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1a7b0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
1a7c0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68   int i = 0;.  wh
1a7d0 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e  ile( i<pParse->n
1a7e0 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1a7f0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1a800 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
1a810 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20  ColCache[i];.   
1a820 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20   if( p->iReg >= 
1a830 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20  iReg && p->iReg 
1a840 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20  < iReg+nReg ){. 
1a850 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
1a860 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b  lear(pParse, i);
1a870 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a880 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    i++;.    }.  }
1a890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
1a8a0 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  er the current c
1a8b0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74  olumn cache cont
1a8c0 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e  ext.  Any new en
1a8d0 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61  tries added.** a
1a8e0 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75  dded to the colu
1a8f0 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74  mn cache after t
1a900 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d  his call are rem
1a910 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  oved when the.**
1a920 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
1a930 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  op occurs..*/.vo
1a940 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1a950 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70  chePush(Parse *p
1a960 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
1a970 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b  ->iCacheLevel++;
1a980 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1a990 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1a9a0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1a9b0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1a9c0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1a9d0 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e  tf("PUSH to %d\n
1a9e0 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1a9f0 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1aa00 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
1aa10 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ove from the col
1aa20 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e  umn cache any en
1aa30 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  tries that were 
1aa40 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a  added since the.
1aa50 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
1aa60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1aa70 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Push operation. 
1aa80 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1aa90 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20   restore.** the 
1aaa0 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61  cache to the sta
1aab0 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69  te it was in pri
1aac0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
1aad0 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64  nt Push..*/.void
1aae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1aaf0 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
1ab00 73 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  se){.  int i = 0
1ab10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1ab20 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
1ab30 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
1ab40 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
1ab50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1ab60 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1ab70 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1ab80 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1ab90 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1aba0 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
1abb0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1abc0 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
1abd0 66 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61  f.  while( i<pPa
1abe0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
1abf0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
1ac00 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1ac10 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
1ac20 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
1ac30 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
1ac40 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ar(pParse, i);. 
1ac50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ac60 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  i++;.    }.  }.}
1ac70 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
1ac80 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
1ac90 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
1aca0 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
1acb0 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
1acc0 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
1acd0 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
1ace0 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
1acf0 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
1ad00 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
1ad10 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
1ad20 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
1ad30 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
1ad40 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
1ad50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ad60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ad70 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
1ad80 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1ad90 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
1ada0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1adb0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
1adc0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1add0 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
1ade0 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
1adf0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1ae00 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
1ae10 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
1ae20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1ae30 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1ae40 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1ae50 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1ae60 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1ae70 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1ae80 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1ae90 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1aea0 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
1aeb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1aec0 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1aed0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1aee0 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1aef0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1af00 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1af10 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1af20 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1af30 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1af40 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1af50 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1af60 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1af70 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1af80 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1af90 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1afa0 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1afb0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1afc0 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1afd0 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1afe0 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1aff0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1b000 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1b010 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1b020 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1b030 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1b040 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1b050 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1b060 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1b070 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1b080 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1b090 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1b0a0 62 20 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20  b = iTabCur;.   
1b0b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b0c0 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64  Copy(pParse, pId
1b0d0 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69  x->aColExpr->a[i
1b0e0 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72  IdxCol].pExpr, r
1b0f0 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
1b100 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1b110 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1b120 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64  able(pParse->pVd
1b130 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  be, pIdx->pTable
1b140 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  , iTabCur,.     
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b170 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  TabCol, regOut);
1b180 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1b190 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1b1a0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1b1b0 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
1b1c0 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
1b1d0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1b1e0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1b1f0 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
1b200 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
1b210 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
1b220 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1b230 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1b240 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1b250 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
1b260 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
1b270 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
1b280 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f  table cursor.  O
1b290 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20  r the PK cursor 
1b2a0 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1b2b0 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  D */.  int iCol,
1b2c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1b2d0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
1b2e0 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
1b2f0 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
1b300 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1b310 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ue into this reg
1b320 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
1b330 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
1b340 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
1b350 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b360 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1b370 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
1b380 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
1b390 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
1b3a0 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
1b3b0 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
1b3c0 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  lumn;.    int x 
1b3d0 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20  = iCol;.    if( 
1b3e0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
1b3f0 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
1b400 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d  ab) ){.      x =
1b410 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1b420 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69  Index(sqlite3Pri
1b430 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
1b440 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d  b), iCol);.    }
1b450 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b460 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
1b470 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74  abCur, x, regOut
1b480 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
1b490 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
1b4a0 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
1b4b0 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20  (v, pTab, iCol, 
1b4c0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
1b4d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1b4e0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
1b4f0 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
1b500 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
1b510 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
1b520 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
1b530 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72  umn value in a r
1b540 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20  egister. .**.** 
1b550 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  An effort is mad
1b560 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
1b570 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
1b580 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54  egister iReg.  T
1b590 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61  his.** is not ga
1b5a0 72 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74  ranteeed for Get
1b5b0 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72  Column() - the r
1b5c0 65 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f  esult can be sto
1b5d0 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65  red in.** any re
1b5e0 67 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65  gister.  But the
1b5f0 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61   result is guara
1b600 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e  nteed to land in
1b610 20 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a   register iReg.*
1b620 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54  * for GetColumnT
1b630 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  oReg()..**.** Th
1b640 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
1b650 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
1b660 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
1b670 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1b680 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
1b690 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
1b6a0 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
1b6b0 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
1b6c0 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  the rowid..*/.in
1b6d0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1b6e0 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
1b6f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1b700 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1b710 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1b720 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1b730 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1b740 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1b750 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1b760 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1b770 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1b780 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1b790 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1b7a0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1b7b0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1b7c0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1b7d0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1b7e0 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f  t iReg,        /
1b7f0 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1b800 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20  here */.  u8 p5 
1b810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35             /* P5
1b820 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f   value for OP_Co
1b830 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a  lumn + FLAGS */.
1b840 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1b850 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1b860 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1b870 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
1b880 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1b890 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1b8a0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1b8b0 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  he; i++, p++){. 
1b8c0 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65     if( p->iTable
1b8d0 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
1b8e0 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
1b8f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
1b900 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1b910 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
1b920 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1b930 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
1b940 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
1b950 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
1b960 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
1b970 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
1b980 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b990 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1b9a0 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
1b9b0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1b9c0 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
1b9d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1b9e0 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
1b9f0 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
1ba00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1ba10 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
1ba20 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1ba30 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
1ba40 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71   iReg;.}.void sq
1ba50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1ba60 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50  ColumnToReg(.  P
1ba70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1ba80 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1ba90 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1baa0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
1bab0 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
1bac0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1bad0 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
1bae0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
1baf0 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
1bb00 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1bb10 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1bb20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1bb30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1bb40 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1bb50 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1bb60 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
1bb70 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
1bb80 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1bb90 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  t r1 = sqlite3Ex
1bba0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1bbb0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
1bbc0 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69  olumn, iTable, i
1bbd0 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  Reg, 0);.  if( r
1bbe0 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65  1!=iReg ) sqlite
1bbf0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1bc00 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1bc10 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a  opy, r1, iReg);.
1bc20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
1bc30 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
1bc40 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
1bc50 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1bc60 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
1bc70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
1bc80 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
1bc90 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1bca0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1bcb0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1bcc0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1bcd0 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d  ("CLEAR\n");.  }
1bce0 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
1bcf0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
1bd00 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
1bd10 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
1bd20 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52  olCache[i].tempR
1bd30 65 67 0a 20 20 20 20 20 26 26 20 70 50 61 72 73  eg.     && pPars
1bd40 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1bd50 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1bd60 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b 0a 20  empReg).    ){. 
1bd70 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
1bd80 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1bd90 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61  TempReg++] = pPa
1bda0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1bdb0 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ].iReg;.    }.  
1bdc0 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  }.  pParse->nCol
1bdd0 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Cache = 0;.}../*
1bde0 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
1bdf0 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69  act that an affi
1be00 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20  nity change has 
1be10 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75  occurred on iCou
1be20 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  nt.** registers 
1be30 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53  starting with iS
1be40 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tart..*/.void sq
1be50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1be60 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72  finityChange(Par
1be70 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1be80 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75  iStart, int iCou
1be90 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  nt){.  sqlite3Ex
1bea0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1beb0 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43  arse, iStart, iC
1bec0 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ount);.}../*.** 
1bed0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1bee0 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
1bef0 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
1bf00 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
1bf10 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
1bf20 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65  ..iTo+nReg-1. Ke
1bf30 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
1bf40 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
1bf50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1bf60 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
1bf70 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1bf80 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
1bf90 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65  nt nReg){.  asse
1bfa0 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e  rt( iFrom>=iTo+n
1bfb0 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65  Reg || iFrom+nRe
1bfc0 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69  g<=iTo );.  sqli
1bfd0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
1bfe0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1bff0 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
1c000 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74  , nReg);.  sqlit
1c010 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1c020 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c  e(pParse, iFrom,
1c030 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64   nReg);.}..#if d
1c040 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1c050 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1c060 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
1c070 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
1c080 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
1c090 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
1c0a0 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
1c0b0 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
1c0c0 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
1c0d0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
1c0e0 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
1c0f0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77  outine is used w
1c100 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
1c110 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
1c120 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64  cros only.** and
1c130 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
1c140 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   in a normal bui
1c150 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
1c160 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
1c170 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
1c180 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1c190 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
1c1a0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1c1b0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
1c1c0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1c1d0 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1c1e0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1c1f0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
1c200 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
1c210 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
1c220 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
1c230 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54   1;    /*NO_TEST
1c240 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1c250 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1c260 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53  QLITE_DEBUG || S
1c270 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
1c280 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43  EST */.../*.** C
1c290 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72 20  onvert a scalar 
1c2a0 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1c2b0 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
1c2c0 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20   referencing.** 
1c2d0 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20  register iReg.  
1c2e0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1c2f0 65 6e 73 75 72 65 20 74 68 61 74 20 69 52 65 67  ensure that iReg
1c300 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
1c310 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
1c320 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65   value for the e
1c330 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
1c340 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f  atic void exprTo
1c350 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70  Register(Expr *p
1c360 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70  , int iReg){.  p
1c370 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20  ->op2 = p->op;. 
1c380 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49   p->op = TK_REGI
1c390 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  STER;.  p->iTabl
1c3a0 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72  e = iReg;.  Expr
1c3b0 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
1c3c0 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a   EP_Skip);.}../*
1c3d0 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20  .** Evaluate an 
1c3e0 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68  expression (eith
1c3f0 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
1c400 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1c410 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  on) and store.**
1c420 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63   the result in c
1c430 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f  ontinguous tempo
1c440 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e 20  rary registers. 
1c450 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1c460 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  x of.** the firs
1c470 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20  t register used 
1c480 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
1c490 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ult..**.** If th
1c4a0 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1c4b0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  t register is a 
1c4c0 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72  temporary scalar
1c4d0 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  , then also writ
1c4e0 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74  e.** that regist
1c4f0 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  er number into *
1c500 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20  piFreeable.  If 
1c510 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1c520 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  ult register.** 
1c530 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1c540 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  ry or if the exp
1c550 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63  ression is a vec
1c560 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65 61  tor set *piFreea
1c570 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a  ble.** to 0..*/.
1c580 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
1c590 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65 20  odeVector(Parse 
1c5a0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1c5b0 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c  , int *piFreeabl
1c5c0 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c  e){.  int iResul
1c5d0 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  t;.  int nResult
1c5e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1c5f0 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69  ctorSize(p);.  i
1c600 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b  f( nResult==1 ){
1c610 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73  .    iResult = s
1c620 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c630 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69  mp(pParse, p, pi
1c640 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  Freeable);.  }el
1c650 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61  se{.    *piFreea
1c660 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ble = 0;.    if(
1c670 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43   p->op==TK_SELEC
1c680 54 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 75  T ){.      iResu
1c690 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  lt = sqlite3Code
1c6a0 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
1c6b0 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , p, 0, 0);.    
1c6c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1c6d0 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c   i;.      iResul
1c6e0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
1c6f0 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  +1;.      pParse
1c700 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
1c710 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  t;.      for(i=0
1c720 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
1c730 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c740 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72  e3ExprCodeFactor
1c750 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  able(pParse, p->
1c760 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
1c770 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b  xpr, i+iResult);
1c780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c790 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73   }.  return iRes
1c7a0 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ult;.}.../*.** G
1c7b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
1c7c0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
1c7d0 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
1c7e0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
1c7f0 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
1c800 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1c810 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1c820 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
1c830 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
1c840 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
1c850 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
1c860 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
1c870 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
1c880 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
1c890 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
1c8a0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
1c8b0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1c8c0 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
1c8d0 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
1c8e0 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
1c8f0 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
1c900 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
1c910 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
1c920 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
1c930 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
1c940 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
1c950 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
1c960 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
1c970 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1c980 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
1c990 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1c9a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1c9b0 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1c9c0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1c9d0 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
1c9e0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1c9f0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca10 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
1ca20 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1ca30 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
1ca40 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
1ca50 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1ca60 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
1ca70 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1ca80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1ca90 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1caa0 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1cab0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
1cac0 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
1cad0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1cae0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1caf0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1cb00 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  */.  int r1, r2;
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb20 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
1cb30 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
1cb40 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20  Expr tempX;     
1cb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1cb60 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  porary expressio
1cb70 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n node */.  int 
1cb80 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  p5 = 0;..  asser
1cb90 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
1cba0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
1cbb0 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
1cbc0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1cbd0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1cbe0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1cbf0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1cc00 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1cc10 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
1cc20 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
1cc30 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1cc40 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
1cc50 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1cc60 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
1cc70 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
1cc80 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
1cc90 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1cca0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1ccb0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
1ccc0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
1ccd0 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
1cce0 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
1ccf0 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
1cd00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
1cd10 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
1cd20 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d      return pCol-
1cd30 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  >iMem;.      }el
1cd40 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
1cd50 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
1cd60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1cd70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1cd80 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
1cd90 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
1cda0 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1cdd0 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1cde0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1cdf0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1ce00 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
1ce10 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
1ce20 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
1ce30 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
1ce40 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1ce50 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
1ce60 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
1ce70 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  le;.      if( iT
1ce80 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1ce90 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  if( pParse->ckBa
1cea0 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
1ceb0 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
1cec0 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
1ced0 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
1cee0 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
1cef0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  x */.          r
1cf00 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f  eturn pExpr->iCo
1cf10 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
1cf20 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 7d  kBase;.        }
1cf30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1cf40 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70  /* Coding an exp
1cf50 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
1cf60 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  part of an index
1cf70 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61   where column na
1cf80 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mes.          **
1cf90 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65   in the index re
1cfa0 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  fer to the table
1cfb0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e   to which the in
1cfc0 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  dex belongs */. 
1cfd0 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
1cfe0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1cff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d000 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1d010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d020 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1d030 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1d060 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1d070 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1d0a0 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op2);.    }.  
1d0b0 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1d0c0 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
1d0d0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1d0e0 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
1d0f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1d100 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1d110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d120 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1d130 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
1d140 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1d150 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d160 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1d170 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1d180 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78   codeReal(v, pEx
1d190 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
1d1a0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1d1b0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1d1c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1d1d0 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1d1e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1d1f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d200 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1d210 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71  lue) );.      sq
1d220 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
1d230 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70  ing(v, target, p
1d240 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1d250 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1d260 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1d270 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
1d280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d290 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1d2a0 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1d2b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1d2c0 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
1d2d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
1d2e0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
1d2f0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
1d300 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
1d310 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d320 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
1d330 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
1d340 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d350 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1d360 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1d370 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1d380 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
1d390 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
1d3a0 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
1d3b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1d3c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
1d3d0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1d3e0 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
1d3f0 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
1d400 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1d410 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
1d420 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
1d430 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
1d440 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
1d450 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
1d460 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
1d470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d480 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
1d490 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
1d4a0 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
1d4b0 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75  MIC);.      retu
1d4c0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1d4d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1d4e0 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
1d4f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d500 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d510 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d520 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1d530 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1d540 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ken!=0 );.      
1d550 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1d560 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
1d570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d580 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56  beAddOp2(v, OP_V
1d590 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
1d5a0 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
1d5b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
1d5c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d  r->u.zToken[1]!=
1d5d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1d5e0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1d5f0 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
1d600 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
1d610 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t, pExpr->iColum
1d620 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
1d630 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1d640 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73  ken[0]=='?' || s
1d650 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  trcmp(pExpr->u.z
1d660 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a  Token, z)==0 );.
1d670 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1d680 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f  pVList[0] = 0; /
1d690 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74  * Indicate VList
1d6a0 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   may no longer b
1d6b0 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1d6c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d6d0 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68  eAppendP4(v, (ch
1d6e0 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43  ar*)z, P4_STATIC
1d6f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d700 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1d710 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1d720 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
1d730 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
1d740 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  ->iTable;.    }.
1d750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d760 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
1d770 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
1d780 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
1d790 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
1d7a0 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
1d7b0 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
1d7c0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1d7d0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1d7e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1d7f0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
1d800 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
1d810 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
1d820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d830 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
1d840 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
1d850 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
1d860 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
1d870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d880 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74  ddOp2(v, OP_Cast
1d890 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74    sqlite3Affinit
1d8c0 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
1d8d0 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20  Token, 0));.    
1d8e0 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
1d8f0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
1d900 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
1d910 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
1d920 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1d930 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1d940 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
1d950 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65       return inRe
1d960 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  g;.    }.#endif 
1d970 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
1d980 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
1d990 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1d9a0 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
1d9b0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
1d9c0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
1d9d0 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c  ;.      p5 = SQL
1d9e0 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
1d9f0 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67    /* fall-throug
1da00 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
1da10 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1da20 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1da30 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1da40 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1da50 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1da60 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  _EQ: {.      Exp
1da70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1da80 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69  ->pLeft;.      i
1da90 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1daa0 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b  Vector(pLeft) ){
1dab0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63  .        codeVec
1dac0 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  torCompare(pPars
1dad0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1dae0 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20  , op, p5);.     
1daf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1db00 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1db10 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1db20 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
1db30 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
1db40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1db50 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1db60 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1db70 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1db80 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1db90 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  se, pLeft, pExpr
1dba0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1dbb0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1dbc0 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
1dbd0 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20  STOREP2 | p5);. 
1dbe0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dbf0 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
1dc00 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
1dc10 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dc20 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
1dc30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dc40 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
1dc50 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
1dc60 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dc70 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
1dc80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dc90 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1dca0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1dcb0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dcc0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1dcd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dce0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
1dcf0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
1dd00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dd10 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
1dd20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dd30 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1dd40 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1dd50 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dd60 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1dd70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dd80 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1dd90 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1dda0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1ddb0 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1ddc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ddd0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1dde0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ddf0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1de00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1de10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1de20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
1de30 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
1de40 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
1de50 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1de60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
1de70 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1de80 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
1de90 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
1dea0 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
1deb0 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
1dec0 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
1ded0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
1dee0 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
1def0 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
1df00 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
1df10 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20  ND==OP_And );   
1df20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1df30 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
1df40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1df50 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20  K_OR==OP_Or );  
1df60 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1df70 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20  case( op==TK_OR 
1df80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1df90 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
1dfa0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65   );           te
1dfb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50  stcase( op==TK_P
1dfc0 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  LUS );.      ass
1dfd0 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
1dfe0 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20  P_Subtract );   
1dff0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e000 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
1e010 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
1e020 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
1e030 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1e040 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
1e050 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e060 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
1e070 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  d );      testca
1e080 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
1e090 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1e0a0 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
1e0b0 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20  BitOr );        
1e0c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e0d0 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
1e0e0 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48  assert( TK_SLASH
1e0f0 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20  ==OP_Divide );  
1e100 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e110 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
1e120 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e130 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  LSHIFT==OP_Shift
1e140 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61  Left );   testca
1e150 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
1e160 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1e170 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
1e180 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20  _ShiftRight );  
1e190 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e1a0 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
1e1b0 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
1e1c0 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
1e1d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e1e0 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
1e1f0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e200 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e210 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e220 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e230 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1e240 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e250 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e260 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1e270 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1e280 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1e290 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
1e2a0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1e2b0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e2c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e2d0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1e2e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e2f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e300 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
1e310 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1e320 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1e330 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
1e340 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
1e350 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
1e360 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
1e370 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1e380 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  e, pLeft, 1, tar
1e390 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1e3a0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66  turn target;.#if
1e3b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e3c0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1e3d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e3e0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
1e3f0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
1e400 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1e410 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e420 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1e430 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
1e440 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
1e450 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
1e460 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1e470 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20  arget;.#endif.  
1e480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e490 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
1e4a0 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
1e4b0 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
1e4c0 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
1e4d0 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
1e4e0 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
1e4f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
1e500 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e510 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1e520 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
1e530 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1e540 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e550 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e560 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1e570 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
1e580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1e590 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
1e5a0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1e5b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e5c0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1e5d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e5e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e5f0 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
1e600 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1e610 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e620 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
1e630 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74  BitNot );   test
1e640 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1e650 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NOT );.      ass
1e660 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
1e670 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74  Not );         t
1e680 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e690 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1e6a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e6b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e6c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1e6d0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1e6e0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1e6f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1e700 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e710 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29  , op, r1, inReg)
1e720 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e730 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e740 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
1e750 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
1e760 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
1e770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e780 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
1e790 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
1e7a0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1e7b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e7c0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
1e7d0 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
1e7e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1e7f0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
1e800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e810 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1e820 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e830 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e840 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e850 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1e860 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1e870 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e880 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1e890 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1e8a0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
1e8b0 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1e8c0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1e8d0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
1e8e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1e8f0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
1e900 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1e910 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e920 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1e930 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
1e940 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1e950 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
1e960 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e970 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1e980 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1e990 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
1e9a0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1e9b0 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
1e9c0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
1e9d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e9e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e9f0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1ea00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ea10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ea20 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
1ea30 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
1ea40 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1ea50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ea60 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e        return pIn
1ea70 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
1ea80 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
1ea90 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1eaa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eab0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
1eac0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1ead0 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
1eae0 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
1eaf0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1eb00 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
1eb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1eb20 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
1eb30 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1eb40 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
1eb50 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
1eb60 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
1eb70 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
1eb80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1eb90 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
1eba0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
1ebb0 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
1ebc0 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
1ebd0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
1ebe0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1ebf0 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
1ec00 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
1ec10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ec20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1ec30 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  r */.      sqlit
1ec40 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ec50 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  >db;  /* The dat
1ec60 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1ec70 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
1ec80 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
1ec90 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
1eca0 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
1ecb0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
1ecc0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
1ecd0 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
1ece0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1ecf0 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  nce */..      as
1ed00 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ed10 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ed20 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1ed30 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1ed40 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ed50 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1ed60 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1ed70 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1ed80 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1ed90 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1eda0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1edb0 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
1edc0 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
1edd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1ede0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1edf0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1ee00 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
1ee10 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1ee20 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  en;.      pDef =
1ee30 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1ee40 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46  tion(db, zId, nF
1ee50 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69  arg, enc, 0);.#i
1ee60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ee70 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46  LE_UNKNOWN_SQL_F
1ee80 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  UNCTION.      if
1ee90 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61  ( pDef==0 && pPa
1eea0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
1eeb0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
1eec0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1eed0 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22  on(db, "unknown"
1eee0 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
1eef0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1ef00 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
1ef10 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e  =0 || pDef->xFin
1ef20 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
1ef30 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1ef40 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1ef50 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
1ef60 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20  s()", zId);.    
1ef70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ef80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
1ef90 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
1efa0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1efb0 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
1efc0 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
1efd0 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
1efe0 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
1eff0 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
1f000 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a  y evaluation of.
1f010 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
1f020 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
1f030 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
1f040 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
1f050 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
1f060 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1f070 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29  _FUNC_COALESCE )
1f080 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e  {.        int en
1f090 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69  dCoalesce = sqli
1f0a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f0b0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  (v);.        ass
1f0c0 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b  ert( nFarg>=2 );
1f0d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f0e0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1f0f0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1f100 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1f110 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
1f120 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
1f130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f140 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1f150 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20  otNull, target, 
1f160 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
1f170 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1f180 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1f190 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f1a0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1f1b0 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20  , target, 1);.  
1f1c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f1d0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1f1e0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
1f1f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1f200 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1f210 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
1f220 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
1f230 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f240 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1f250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1f260 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1f270 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65  abel(v, endCoale
1f280 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  sce);.        br
1f290 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
1f2a0 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b      /* The UNLIK
1f2b0 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ELY() function i
1f2c0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20  s a no-op.  The 
1f2d0 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61  result is the va
1f2e0 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lue.      ** of 
1f2f0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1f300 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
1f310 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
1f320 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
1f330 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
1f340 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f350 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20   nFarg>=1 );.   
1f360 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1f370 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1f380 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  t(pParse, pFarg-
1f390 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
1f3a0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  get);.      }.. 
1f3b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1f3c0 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
1f3d0 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
1f3e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
1f3f0 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
1f400 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
1f410 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f420 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
1f430 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
1f440 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20   MASKBIT32(i);. 
1f450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f460 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
1f470 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1f480 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
1f490 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
1f4a0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1f4b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1f4c0 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
1f4d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1f4e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f4f0 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
1f500 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1f510 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20  constMask ){.   
1f520 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72         r1 = pPar
1f530 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1f540 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1f550 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20  em += nFarg;.   
1f560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f570 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f580 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1f590 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
1f5a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1f5b0 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28    /* For length(
1f5c0 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66  ) and typeof() f
1f5d0 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20  unctions with a 
1f5e0 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c  column argument,
1f5f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
1f600 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
1f610 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d   to the OP_Colum
1f620 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c  n opcode to OPFL
1f630 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20  AG_LENGTHARG.   
1f640 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41       ** or OPFLA
1f650 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70  G_TYPEOFARG resp
1f660 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f  ectively, to avo
1f670 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64  id unnecessary d
1f680 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ata.        ** l
1f690 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  oading..        
1f6a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
1f6b0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1f6c0 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
1f6d0 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
1f6e0 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
1f6f0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
1f700 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
1f710 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
1f720 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
1f730 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
1f740 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
1f750 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
1f760 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1f770 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
1f780 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
1f790 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
1f7a0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
1f7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f7c0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
1f7d0 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
1f7e0 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f800 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
1f810 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
1f820 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
1f830 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f840 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
1f850 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  s & OPFLAG_LENGT
1f860 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
1f870 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e      pFarg->a[0].
1f880 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20  pExpr->op2 = .  
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8a0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1f8b0 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
1f8c0 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
1f8d0 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
1f8e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
1f8f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f900 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1f910 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  e);     /* Ticke
1f920 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
1f930 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1f940 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1f950 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
1f960 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   r1, 0,.        
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f980 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
1f990 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45  CEL_DUP|SQLITE_E
1f9a0 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20  CEL_FACTOR);.   
1f9b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f9c0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1f9d0 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  ;      /* Ticket
1f9e0 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
1f9f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fa00 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
1fa10 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1fa20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1fa30 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
1fa40 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
1fa50 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
1fa60 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
1fa70 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
1fa80 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
1fa90 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
1faa0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
1fab0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
1fac0 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
1fad0 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
1fae0 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
1faf0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
1fb00 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
1fb10 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
1fb20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
1fb30 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1fb40 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
1fb50 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
1fb60 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
1fb70 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
1fb80 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
1fb90 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
1fba0 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
1fbb0 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
1fbc0 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
1fbd0 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
1fbe0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1fbf0 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
1fc00 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
1fc10 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1fc20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
1fc30 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
1fc40 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
1fc50 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
1fc60 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
1fc70 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
1fc80 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
1fc90 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
1fca0 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
1fcb0 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
1fcc0 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
1fcd0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
1fce0 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
1fcf0 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
1fd00 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
1fd10 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
1fd20 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
1fd30 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
1fd40 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
1fd50 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
1fd60 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
1fd70 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
1fd80 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
1fd90 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
1fda0 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
1fdb0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1fdc0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1fdd0 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
1fde0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1fdf0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
1fe00 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
1fe10 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
1fe20 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
1fe30 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
1fe40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1fe50 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
1fe60 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
1fe70 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1fe80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1fe90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1fea0 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30  (v, OP_Function0
1feb0 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
1fec0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fee0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
1fef0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
1ff00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1ff10 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
1ff20 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46  g);.      if( nF
1ff30 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b  arg && constMask
1ff40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1ff50 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1ff60 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
1ff70 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
1ff80 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1ff90 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1ffa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ffb0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
1ffc0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
1ffd0 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
1ffe0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  T: {.      int n
1fff0 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
20000 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53  ase( op==TK_EXIS
20010 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
20020 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c  case( op==TK_SEL
20030 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ECT );.      if(
20040 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26   op==TK_SELECT &
20050 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d  & (nCol = pExpr-
20060 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
20070 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b  st->nExpr)!=1 ){
20080 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20090 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
200a0 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b  Parse, nCol, 1);
200b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
200c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
200d0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
200e0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
200f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
20100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20110 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
20120 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
20130 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
20140 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d  >pLeft->iTable==
20150 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
20160 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
20170 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  e = sqlite3CodeS
20180 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
20190 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
201a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
201b0 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
201c0 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
201d0 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
201e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
201f0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
20200 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
20210 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20220 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
20230 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
20240 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20250 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
20260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20270 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
20280 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20290 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
202a0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
202b0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
202c0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
202d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
202e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
202f0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
20300 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20310 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
20320 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
20330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20340 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
20350 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
20360 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20370 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20380 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20390 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
203a0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  t;.    }.#endif 
203b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
203c0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20  UBQUERY */...   
203d0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
203e0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
203f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
20400 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
20410 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
20420 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
20430 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
20440 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
20450 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
20460 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
20470 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
20480 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
20490 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
204a0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
204b0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
204c0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
204d0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
204e0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
204f0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
20500 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a   target, 0, 0);.
20510 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
20520 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
20530 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20  ase TK_SPAN:.   
20540 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
20550 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
20560 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65  PLUS: {.      re
20570 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
20580 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
20590 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
205a0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
205b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
205c0 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
205d0 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
205e0 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
205f0 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
20600 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
20610 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
20620 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
20630 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
20640 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
20650 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
20660 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
20670 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
20680 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
20690 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
206a0 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
206b0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
206c0 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
206d0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
206e0 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
206f0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
20700 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
20710 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
20720 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
20730 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
20740 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
20750 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20760 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
20770 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
20780 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61  using an OP_Para
20790 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31  m opcode. The p1
207a0 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65  .      ** parame
207b0 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
207c0 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64  for an old.rowid
207d0 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74   reference, or t
207e0 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a  o (i+1).      **
207f0 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
20800 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20  other column of 
20810 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
20820 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20  -table, where . 
20830 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65       ** i is the
20840 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
20850 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e  lumn. For a new.
20860 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
20870 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   p1 is.      ** 
20880 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68  set to (n+1), wh
20890 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d  ere n is the num
208a0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
208b0 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61  n each pseudo-ta
208c0 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f  ble..      ** Fo
208d0 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  r a reference to
208e0 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d   any other colum
208f0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70  n in the new.* p
20900 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a  seudo-table, p1.
20910 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
20920 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72  to (n+2+i), wher
20930 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73  e n and i are as
20940 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75   defined previou
20950 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a  sly. For.      *
20960 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
20970 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68  e table on which
20980 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65   triggers are be
20990 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20  ing fired is.   
209a0 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61     ** declared a
209b0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
209c0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
209d0 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
209e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
209f0 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72  Then p1 is inter
20a00 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
20a10 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
20a20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d    **   p1==0   -
20a30 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20  >    old.rowid  
20a40 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20     p1==3   ->   
20a50 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20   new.rowid.     
20a60 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e   **   p1==1   ->
20a70 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20      old.a       
20a80 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20    p1==4   ->    
20a90 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20  new.a.      **  
20aa0 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f   p1==2   ->    o
20ab0 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d  ld.b         p1=
20ac0 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62  =5   ->    new.b
20ad0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f         .      */
20ae0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
20af0 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
20b00 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d  ;.      int p1 =
20b10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a   pExpr->iTable *
20b20 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20   (pTab->nCol+1) 
20b30 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  + 1 + pExpr->iCo
20b40 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73  lumn;..      ass
20b50 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62  ert( pExpr->iTab
20b60 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  le==0 || pExpr->
20b70 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
20b80 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
20b90 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26  ->iColumn>=-1 &&
20ba0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
20bb0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
20bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
20bd0 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78  ->iPKey<0 || pEx
20be0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61  pr->iColumn!=pTa
20bf0 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20  b->iPKey );.    
20c00 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20    assert( p1>=0 
20c10 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f  && p1<(pTab->nCo
20c20 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20  l*2+2) );..     
20c30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20c40 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20  p2(v, OP_Param, 
20c50 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  p1, target);.   
20c60 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
20c70 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64  v, "%s.%s -> $%d
20c80 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ",.        (pExp
20c90 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77  r->iTable ? "new
20ca0 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20  " : "old"),.    
20cb0 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c      (pExpr->iCol
20cc0 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20  umn<0 ? "rowid" 
20cd0 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61  : pExpr->pTab->a
20ce0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
20cf0 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  mn].zName),.    
20d00 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20      target.     
20d10 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   ));..#ifndef SQ
20d20 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
20d30 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f  NG_POINT.      /
20d40 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
20d50 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74  has REAL affinit
20d60 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e  y, it may curren
20d70 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  tly be stored as
20d80 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   an.      ** int
20d90 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61  eger. Use OP_Rea
20da0 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b  lAffinity to mak
20db0 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61  e sure it is rea
20dc0 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20  lly real..      
20dd0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
20de0 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35  ENCE-OF: R-60985
20df0 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20 77 69  -57662 SQLite wi
20e00 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76  ll convert the v
20e10 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20  alue back to.   
20e20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70     ** floating p
20e30 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63  oint when extrac
20e40 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65  ting it from the
20e50 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20   record.  */.   
20e60 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
20e70 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
20e80 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
20e90 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
20ea0 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
20eb0 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
20ec0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20ed0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
20ee0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
20ef0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
20f00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
20f10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
20f20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20  case TK_VECTOR: 
20f30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20f40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20f50 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
20f60 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ed");.      brea
20f70 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
20f80 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
20f90 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
20fa0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
20fb0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
20fc0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
20fd0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
20fe0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
20ff0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
21000 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
21010 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
21020 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
21030 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
21040 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
21050 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
21060 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
21070 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
21080 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
21090 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
210a0 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
210b0 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
210c0 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
210d0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
210e0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
210f0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
21100 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
21110 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
21120 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
21130 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
21140 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
21150 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
21160 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
21170 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
21180 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
21190 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
211a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
211b0 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
211c0 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
211d0 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
211e0 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
211f0 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
21200 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
21210 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
21220 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
21230 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
21240 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
21250 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
21260 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
21270 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
21280 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
21290 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
212a0 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
212b0 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
212c0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
212d0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
212e0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
212f0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
21300 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
21310 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
21320 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
21330 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
21360 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
21370 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
21380 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
213b0 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
213c0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
213d0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213f0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
21400 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
21410 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21440 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
21450 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
21480 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
21490 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
214a0 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
214b0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
214c0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
214d0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
214e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
214f0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
21500 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
21510 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
21540 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
21550 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
21560 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21570 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
21580 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
21590 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
215a0 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
215b0 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
215c0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
215d0 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
215e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
215f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
21600 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
21610 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
21620 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
21630 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
21640 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
21650 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
21660 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
21670 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
21680 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
21690 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
216a0 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
216b0 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
216c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
216d0 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
216e0 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
216f0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
21700 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
21710 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
21720 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
21730 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
21740 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70  ster(&tempX, exp
21750 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
21760 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
21770 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
21780 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
21790 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
217a0 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70    memset(&opComp
217b0 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f  are, 0, sizeof(o
217c0 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20  pCompare));.    
217d0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
217e0 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
217f0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
21800 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20  t = &tempX;.    
21810 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43      pTest = &opC
21820 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20  ompare;.        
21830 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39  /* Ticket b351d9
21840 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62  5f9cd5ef17e9d9db
21850 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30  ae18f5ca86111900
21860 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  01:.        ** T
21870 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46  he value in regF
21880 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53  ree1 might get S
21890 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65  Copy-ed into the
218a0 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20   file result..  
218b0 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65        ** So make
218c0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
218d0 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72  egFree1 register
218e0 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66   is not reused f
218f0 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20  or other.       
21900 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64   ** purposes and
21910 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72   possibly overwr
21920 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20  itten.  */.     
21930 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b     regFree1 = 0;
21940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
21950 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d  or(i=0; i<nExpr-
21960 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  1; i=i+2){.     
21970 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21980 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
21990 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
219a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
219b0 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b  ert( pTest!=0 );
219c0 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  .          opCom
219d0 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c  pare.pRight = aL
219e0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
219f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21a00 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74  .          pTest
21a10 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
21a20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
21a30 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73  .        nextCas
21a40 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
21a50 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
21a60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21a70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
21a80 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
21a90 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
21aa0 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
21ab0 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
21ac0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
21ad0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21ae0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
21af0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
21b00 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
21b10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21b20 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
21b30 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
21b40 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
21b50 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
21b60 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
21b70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21b80 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
21b90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21ba0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21bb0 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
21bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21bd0 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29  ( (nExpr&1)!=0 )
21be0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21bf0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
21c00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
21c10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21c20 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
21c30 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72  a[nExpr-1].pExpr
21c40 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21c50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21c60 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
21c70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21c80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21c90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
21ca0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
21cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
21cc0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
21cd0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
21ce0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
21cf0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
21d00 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
21d10 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
21d20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21d30 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21d40 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
21d50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21d60 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
21d70 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
21d80 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
21d90 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
21da0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
21db0 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
21dc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
21dd0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
21de0 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
21df0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
21e00 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
21e10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
21e20 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
21e30 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
21e40 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
21e50 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
21e60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21e70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21e90 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
21ea0 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
21eb0 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
21ec0 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
21ed0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
21ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21ef0 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
21f00 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
21f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
21f20 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
21f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
21f40 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
21f50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
21f60 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
21f70 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
21f80 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
21f90 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
21fa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21fb0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
21fc0 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
21fd0 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
21fe0 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
21ff0 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
22000 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
22010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22020 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
22030 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
22040 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
22050 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22070 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
22080 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
22090 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
220a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
220b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
220c0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
220d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
220e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
220f0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
22100 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
22110 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
22120 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
22130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
22140 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
22150 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
22160 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
22170 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
22180 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
22190 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20  prCodeAtInit(.  
221a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
221b0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
221c0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
221d0 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
221e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
221f0 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56   code when the V
22200 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  DBE initializes 
22210 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74  */.  int regDest
22220 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
22230 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69  the value in thi
22240 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
22250 75 38 20 72 65 75 73 61 62 6c 65 20 20 20 20 20  u8 reusable     
22260 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
22270 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
22280 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  reusable */.){. 
22290 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20   ExprList *p;.  
222a0 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63  assert( ConstFac
222b0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b  torOk(pParse) );
222c0 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
222d0 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45 78  ConstExpr;.  pEx
222e0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
222f0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
22300 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d  pExpr, 0);.  p =
22310 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22320 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
22330 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
22340 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74  p ){.     struct
22350 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
22360 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
22370 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
22380 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
22390 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74  xprReg = regDest
223a0 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  ;.     pItem->re
223b0 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62 6c  usable = reusabl
223c0 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  e;.  }.  pParse-
223d0 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b  >pConstExpr = p;
223e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
223f0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
22400 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
22410 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
22420 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
22430 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
22440 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
22450 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
22460 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
22470 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
22480 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
22490 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
224a0 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
224b0 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
224c0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
224d0 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
224e0 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
224f0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
22500 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
22510 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
22520 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  eg to zero..**.*
22530 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
22540 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
22550 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
22560 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a  t generate this.
22570 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20  ** code to fill 
22580 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
22590 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
225a0 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  on section of th
225b0 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61  e.** VDBE progra
225c0 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  m, in order to f
225d0 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20  actor it out of 
225e0 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c  the evaluation l
225f0 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oop..*/.int sqli
22600 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
22610 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
22620 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
22630 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32  *pReg){.  int r2
22640 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
22650 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
22660 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  te(pExpr);.  if(
22670 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
22680 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78  Parse).   && pEx
22690 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
226a0 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65  TER.   && sqlite
226b0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
226c0 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20  otJoin(pExpr).  
226d0 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
226e0 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f  *p = pParse->pCo
226f0 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  nstExpr;.    int
22700 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d   i;.    *pReg  =
22710 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b   0;.    if( p ){
22720 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
22730 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
22740 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  em;.      for(pI
22750 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e  tem=p->a, i=p->n
22760 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d  Expr; i>0; pItem
22770 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  ++, i--){.      
22780 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
22790 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
227a0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
227b0 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d  m->pExpr,pExpr,-
227c0 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
227d0 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
227e0 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
227f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22800 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 32    }.    }.    r2
22810 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22820 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  m;.    sqlite3Ex
22830 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
22840 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c 20  rse, pExpr, r2, 
22850 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
22860 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
22870 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
22880 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  se);.    r2 = sq
22890 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
228a0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
228b0 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20  r, r1);.    if( 
228c0 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20  r2==r1 ){.      
228d0 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20  *pReg = r1;.    
228e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
228f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22900 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
22910 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b        *pReg = 0;
22920 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22930 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
22940 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
22950 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
22960 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
22970 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
22980 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
22990 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
229a0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
229b0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
229c0 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
229d0 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
229e0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
229f0 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
22a00 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
22a10 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
22a20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
22a30 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
22a40 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
22a50 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
22a60 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
22a70 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
22a80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
22a90 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
22aa0 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
22ab0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
22ac0 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
22ad0 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
22ae0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
22af0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
22b00 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
22b10 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
22b20 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72  pVdbe!=0 || pPar
22b30 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
22b40 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
22b50 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
22b60 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
22b70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
22b80 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
22b90 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
22ba0 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
22bb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
22bc0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61  /*.** Make a tra
22bd0 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65  nsient copy of e
22be0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
22bf0 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74  and then code it
22c00 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
22c10 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68  3ExprCode().  Th
22c20 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
22c30 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
22c40 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20  e3ExprCode().** 
22c50 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
22c60 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
22c70 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22c80 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  o be unchanged..
22c90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
22ca0 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
22cb0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
22cc0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
22cd0 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  et){.  sqlite3 *
22ce0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22cf0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
22d00 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
22d10 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  xpr, 0);.  if( !
22d20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22d30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   ) sqlite3ExprCo
22d40 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
22d50 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c  , target);.  sql
22d60 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
22d70 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  b, pExpr);.}../*
22d80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
22d90 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
22da0 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
22db0 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
22dc0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
22dd0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
22de0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
22df0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
22e00 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
22e10 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
22e20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
22e30 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
22e40 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
22e50 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73  e.** might choos
22e60 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78  e to code the ex
22e70 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74  pression at init
22e80 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
22e90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22ea0 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
22eb0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
22ec0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
22ed0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66  nt target){.  if
22ee0 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73  ( pParse->okCons
22ef0 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74  tFactor && sqlit
22f00 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
22f10 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
22f20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
22f30 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
22f40 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  pr, target, 0);.
22f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
22f60 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
22f70 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
22f80 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
22f90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
22fa0 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
22fb0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
22fc0 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
22fd0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
22fe0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
22ff0 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
23000 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
23010 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
23020 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
23030 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
23040 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
23050 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
23060 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
23070 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
23080 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
23090 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
230a0 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
230b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
230c0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
230d0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
230e0 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
230f0 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
23100 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
23110 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
23120 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
23130 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
23140 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  reused..*/.void 
23150 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
23160 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
23170 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23180 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
23190 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
231a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
231b0 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  t iMem;..  asser
231c0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
231d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
231e0 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
231f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
23200 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
23210 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69  pr, target);.  i
23220 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
23230 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
23240 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23250 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d  Copy, target, iM
23260 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  em);.  exprToReg
23270 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65  ister(pExpr, iMe
23280 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  m);.}../*.** Gen
23290 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
232a0 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
232b0 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
232c0 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
232d0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
232e0 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
232f0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
23300 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
23310 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
23320 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
23330 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
23340 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
23350 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61  ITE_ECEL_DUP fla
23360 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61  g prevents the a
23370 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65  rguments from be
23380 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73  ing.** filled us
23390 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f  ing OP_SCopy.  O
233a0 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75  P_Copy must be u
233b0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
233c0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
233d0 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65  EL_FACTOR argume
233e0 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61  nt allows consta
233f0 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  nt arguments to 
23400 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f  be.** factored o
23410 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69  ut into initiali
23420 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a  zation code..**.
23430 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
23440 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e  EL_REF flag mean
23450 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  s that expressio
23460 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77  ns in the list w
23470 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ith.** ExprList.
23480 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  a[].u.x.iOrderBy
23490 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61  Col>0 have alrea
234a0 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65  dy been evaluate
234b0 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20  d and stored.** 
234c0 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20  in registers at 
234d0 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74  srcReg, and so t
234e0 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  he value can be 
234f0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72  copied from ther
23500 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
23510 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
23520 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
23530 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
23540 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
23550 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
23560 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
23570 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
23580 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
23590 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
235a0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
235b0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
235c0 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20   srcReg,        
235d0 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74  /* Source regist
235e0 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ers if SQLITE_EC
235f0 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66  EL_REF */.  u8 f
23600 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
23610 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
23620 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
23630 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23640 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
23650 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63   i, j, n;.  u8 c
23660 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26  opyOp = (flags &
23670 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
23680 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  ) ? OP_Copy : OP
23690 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a  _SCopy;.  Vdbe *
236a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
236b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  e;.  assert( pLi
236c0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
236d0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
236e0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
236f0 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
23700 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
23710 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
23720 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
23730 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e  Expr;.  if( !Con
23740 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
23750 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53  e) ) flags &= ~S
23760 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
23770 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  R;.  for(pItem=p
23780 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
23790 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
237a0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
237b0 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
237c0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
237d0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52   & SQLITE_ECEL_R
237e0 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70  EF)!=0 && (j = p
237f0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
23800 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20  ByCol)>0 ){.    
23810 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
23820 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
23830 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d  F ){.        i--
23840 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20  ;.        n--;. 
23850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23870 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
23880 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72   j+srcReg-1, tar
23890 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  get+i);.      }.
238a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
238b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
238c0 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26  EL_FACTOR)!=0 &&
238d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
238e0 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
238f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23900 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
23910 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
23920 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65  et+i, 0);.    }e
23930 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
23940 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
23950 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
23960 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
23970 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28  et+i);.      if(
23980 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69   inReg!=target+i
23990 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
239a0 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20  Op *pOp;.       
239b0 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f   if( copyOp==OP_
239c0 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
239d0 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62   (pOp=sqlite3Vdb
239e0 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e  eGetOp(v, -1))->
239f0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a  opcode==OP_Copy.
23a00 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
23a10 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69  >p1+pOp->p3+1==i
23a20 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
23a30 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33   pOp->p2+pOp->p3
23a40 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20  +1==target+i.   
23a50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
23a60 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20    pOp->p3++;.   
23a70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23a90 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
23aa0 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  p, inReg, target
23ab0 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +i);.        }. 
23ac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23ad0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
23ae0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23af0 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45  ode for a BETWEE
23b00 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
23b10 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
23b20 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65   AND z.**.** The
23b30 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61   above is equiva
23b40 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20  lent to .**.**  
23b50 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
23b60 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73  **.** Code it as
23b70 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
23b80 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
23b90 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
23ba0 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e  n.** elimination
23bb0 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   of x..**.** The
23bc0 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74   xJumpIf paramet
23bd0 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65  er determines de
23be0 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tails:.**.**    
23bf0 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  NULL:           
23c00 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
23c10 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
23c20 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a   in reg[dest].**
23c30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23c40 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70  fTrue:      Jump
23c50 20 74 6f 20 64 65 73 74 20 69 66 20 74 72 75 65   to dest if true
23c60 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78  .**    sqlite3Ex
23c70 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a  prIfFalse:     J
23c80 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 66  ump to dest if f
23c90 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  alse.**.** The j
23ca0 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65  umpIfNull parame
23cb0 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
23cc0 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c  f xJumpIf is NUL
23cd0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  L..*/.static voi
23ce0 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65  d exprCodeBetwee
23cf0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
23d00 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
23d10 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
23d20 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
23d30 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
23d40 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57       /* The BETW
23d50 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  EEN expression *
23d60 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
23d70 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
23d80 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f  stination or sto
23d90 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f  rage location */
23da0 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29  .  void (*xJump)
23db0 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e  (Parse*,Expr*,in
23dc0 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f  t,int), /* Actio
23dd0 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69  n to take */.  i
23de0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
23df0 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
23e00 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
23e10 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
23e20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20  Expr exprAnd;   
23e30 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65    /* The AND ope
23e40 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41  rator in  x>=y A
23e50 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78  ND x<=z  */.  Ex
23e60 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20  pr compLeft;    
23e70 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65  /* The  x>=y  te
23e80 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  rm */.  Expr com
23e90 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65  pRight;   /* The
23ea0 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a    x<=z  term */.
23eb0 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20    Expr exprX;   
23ec0 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73      /* The  x  s
23ed0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
23ee0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
23ef0 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79   0; /* Temporary
23f00 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
23f10 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  ...  memset(&com
23f20 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pLeft, 0, sizeof
23f30 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
23f40 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c  t(&compRight, 0,
23f50 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
23f60 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e    memset(&exprAn
23f70 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  d, 0, sizeof(Exp
23f80 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r));..  assert( 
23f90 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23fa0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
23fb0 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58  lect) );.  exprX
23fc0 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74   = *pExpr->pLeft
23fd0 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d  ;.  exprAnd.op =
23fe0 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41   TK_AND;.  exprA
23ff0 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
24000 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
24010 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
24020 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  ght;.  compLeft.
24030 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f  op = TK_GE;.  co
24040 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26  mpLeft.pLeft = &
24050 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66  exprX;.  compLef
24060 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
24070 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
24080 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67  pExpr;.  compRig
24090 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
240a0 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
240b0 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
240c0 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20  pRight.pRight = 
240d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
240e0 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78  a[1].pExpr;.  ex
240f0 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78  prToRegister(&ex
24100 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63  prX, exprCodeVec
24110 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78 70  tor(pParse, &exp
24120 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  rX, &regFree1));
24130 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a  .  if( xJump ){.
24140 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65      xJump(pParse
24150 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
24160 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
24170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
24180 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73 69  ark the expressi
24190 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d  on is being from
241a0 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
241b0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
241c0 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74  n.    ** so that
241d0 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   the sqlite3Expr
241e0 43 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f 75  CodeTarget() rou
241f0 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  tine will not at
24200 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20  tempt to move.  
24210 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65    ** it into the
24220 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70   Parse.pConstExp
24230 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75  r list.  We shou
24240 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62 69 74  ld use a new bit
24250 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a   for this,.    *
24260 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62  * for clarity, b
24270 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66  ut we are out of
24280 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78 70   bits in the Exp
24290 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f  r.flags field so
242a0 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20   we.    ** have 
242b0 74 6f 20 72 65 75 73 65 20 74 68 65 20 45 50 5f  to reuse the EP_
242c0 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42  FromJoin bit.  B
242d0 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78  ummer. */.    ex
242e0 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  prX.flags |= EP_
242f0 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71  FromJoin;.    sq
24300 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
24310 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78 70  get(pParse, &exp
24320 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d  rAnd, dest);.  }
24330 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
24340 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24350 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f   regFree1);..  /
24360 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74  * Ensure adequat
24370 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20  e test coverage 
24380 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  */.  testcase( x
24390 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
243a0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
243b0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
243c0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
243d0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
243e0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
243f0 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
24400 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
24410 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
24420 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
24430 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
24440 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
24450 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
24460 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
24470 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
24480 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
24490 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
244a0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
244b0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
244c0 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
244d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
244e0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
244f0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
24500 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
24510 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
24520 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
24530 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
24540 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
24550 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
24560 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
24570 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
24580 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
24590 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
245a0 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
245b0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
245c0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
245d0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20  tcase( xJump==0 
245e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
245f0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
24600 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
24610 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
24620 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
24630 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
24640 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
24650 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
24660 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
24670 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
24680 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
24690 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
246a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
246b0 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
246c0 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
246d0 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
246e0 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
246f0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
24700 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
24710 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
24720 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
24730 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
24740 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
24750 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
24760 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
24770 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
24780 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
24790 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
247a0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
247b0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
247c0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
247d0 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
247e0 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
247f0 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
24800 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
24810 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
24820 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
24830 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
24840 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
24850 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
24860 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
24870 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
24880 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
24890 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
248a0 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
248b0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
248c0 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
248d0 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
248e0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
248f0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
24900 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
24910 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
24920 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
24930 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
24940 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
24950 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
24960 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
24970 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
24980 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
24990 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
249a0 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
249b0 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
249c0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
249d0 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
249e0 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
249f0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
24a00 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
24a10 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
24a20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
24a30 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
24a40 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
24a50 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
24a60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
24a70 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
24a80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24a90 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24aa0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
24ab0 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
24ac0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
24ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24ae0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
24af0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
24b00 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
24b10 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
24b20 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
24b30 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
24b40 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
24b50 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
24b60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24b70 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
24b80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24b90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
24ba0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
24bb0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
24bc0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
24bd0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
24be0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
24bf0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
24c00 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
24c10 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
24c20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24c30 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24c40 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
24c50 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
24c60 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24c80 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
24c90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24ca0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
24cb0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
24cc0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
24cd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
24ce0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
24cf0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
24d00 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
24d10 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
24d20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
24d30 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
24d40 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
24d50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
24d60 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
24d70 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
24d80 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
24d90 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
24da0 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
24db0 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  E;.      jumpIfN
24dc0 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
24dd0 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
24de0 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
24df0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
24e00 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
24e10 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
24e20 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
24e30 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
24e40 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
24e50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
24e60 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
24e70 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
24e80 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
24e90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
24ea0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
24eb0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
24ec0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
24ed0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
24ee0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
24ef0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
24f00 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
24f10 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
24f20 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
24f30 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
24f40 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
24f50 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
24f60 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
24f80 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
24f90 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
24fa0 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
24fb0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
24fc0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
24fd0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
24fe0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
24ff0 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
25000 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
25010 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
25020 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
25030 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
25040 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
25050 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
25060 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
25070 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
25080 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
25090 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
250a0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
250b0 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
250c0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
250d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
250e0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
250f0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
25100 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
25110 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
25120 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
25130 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
25140 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
25150 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
25160 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
25170 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
25180 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
25190 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
251a0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
251b0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
251c0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
251d0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
251e0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
251f0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
25200 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
25210 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
25220 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
25230 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
25240 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
25250 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
25260 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
25270 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
25280 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
25290 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
252a0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
252b0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
252c0 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
252d0 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
252e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
252f0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
25300 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
25310 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
25320 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
25330 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
25340 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
25350 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
25360 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
25370 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
25380 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25390 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
253a0 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  est);.      Vdbe
253b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
253c0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
253d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
253e0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
253f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
25400 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
25410 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
25420 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
25430 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
25440 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25450 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
25460 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
25470 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
25480 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
25490 74 65 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a  te3ExprIfTrue, j
254a0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
254b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
254c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
254d0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
254e0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
254f0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
25500 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
25510 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25520 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
25530 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
25540 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
25550 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
25560 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
25570 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
25580 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
25590 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
255a0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
255b0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
255c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
255d0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
255e0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
255f0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
25600 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
25610 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
25620 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  :.      if( expr
25630 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
25640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
25650 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
25660 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
25670 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
25680 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
25690 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
256a0 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
256b0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
256c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
256d0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
256e0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
256f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25700 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
25710 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
25720 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
25730 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25740 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
25750 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
25760 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
25770 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25780 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
25790 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
257a0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
257b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
257c0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
257d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
257e0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
257f0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
25800 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
25810 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
25820 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
25830 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
25840 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
25850 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
25860 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
25870 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
25880 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
25890 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
258a0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
258b0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
258c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
258d0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
258e0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
258f0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
25900 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
25910 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
25920 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
25930 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
25940 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
25950 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
25960 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
25970 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
25980 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
25990 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
259a0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
259b0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
259c0 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
259d0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
259e0 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
259f0 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
25a00 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
25a10 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
25a20 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
25a30 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
25a40 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
25a50 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
25a60 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
25a70 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
25a80 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
25a90 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
25aa0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
25ab0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
25ac0 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
25ad0 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
25ae0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
25af0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
25b00 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
25b10 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
25b20 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
25b30 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
25b40 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
25b50 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
25b60 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
25b70 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
25b80 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
25b90 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
25ba0 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
25bb0 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
25bc0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
25bd0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
25bf0 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
25c00 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
25c10 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
25c20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
25c30 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
25c40 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
25c50 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
25c60 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
25c70 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
25c80 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
25c90 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
25ca0 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
25cb0 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
25cc0 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
25cd0 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
25ce0 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
25cf0 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
25d00 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
25d10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
25d20 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
25d30 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
25d40 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
25d50 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
25d60 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
25d70 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
25d80 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
25d90 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
25da0 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
25db0 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
25dc0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
25dd0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25de0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
25df0 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
25e00 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
25e10 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
25e20 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
25e30 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
25e40 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
25e50 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
25e60 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
25e70 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
25e80 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
25e90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25ea0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
25eb0 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
25ec0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25ed0 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
25ee0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
25ef0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
25f00 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
25f10 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
25f20 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
25f30 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
25f40 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
25f50 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
25f60 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
25f70 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
25f80 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
25f90 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
25fa0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
25fb0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
25fc0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25fd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25fe0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
25ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26000 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
26010 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
26020 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26030 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
26040 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
26050 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
26060 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26070 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
26080 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
26090 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
260a0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
260b0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
260c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
260d0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
260e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
260f0 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75  ft, d2, jumpIfNu
26100 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
26110 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
26120 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
26130 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
26140 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26150 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
26160 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
26170 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
26190 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
261a0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
261b0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
261c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
261d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
261e0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
261f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26200 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26210 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26220 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26230 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
26240 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
26250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26260 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
26270 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
26280 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
26290 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
262a0 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
262b0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
262c0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
262d0 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
262e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
262f0 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
26300 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20       jumpIfNull 
26310 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
26320 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
26330 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
26340 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
26350 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
26360 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
26370 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
26380 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
26390 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
263a0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
263b0 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c  Vector(pExpr->pL
263c0 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61  eft) ) goto defa
263d0 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20  ult_expr;.      
263e0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
263f0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
26400 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
26410 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
26420 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26430 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
26440 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
26450 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
26460 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
26470 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
26480 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
26490 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
264a0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
264b0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
264c0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
264d0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
264e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
264f0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
26500 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26510 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
26520 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
26530 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
26540 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
26550 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26560 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
26570 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
26580 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26590 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
265a0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
265b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
265c0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
265d0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
265e0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
265f0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
26600 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26610 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
26620 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
26630 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
26640 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  se(op==OP_Eq);. 
26650 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26660 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
26670 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26680 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
26690 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
266a0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
266b0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  q && jumpIfNull=
266c0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
266d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
266e0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
266f0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
26700 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
26710 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
26720 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
26730 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
26740 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
26750 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
26760 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
26770 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
26780 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
26790 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
267a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
267b0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
267c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
267d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
267e0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
267f0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
26800 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
26810 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
26820 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26830 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
26840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26850 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
26860 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
26870 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
26880 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64  K_ISNULL );   Vd
26890 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
268a0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
268b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
268c0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
268d0 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
268e0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
268f0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
26900 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26910 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
26920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
26930 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
26940 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26950 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26960 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
26970 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
26980 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
26990 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20 6a  e3ExprIfFalse, j
269a0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
269b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
269c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
269d0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
269e0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
269f0 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75      if( jumpIfNu
26a00 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
26a10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
26a20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
26a30 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  est, dest);.    
26a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26a50 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
26a60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
26a70 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
26a80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
26a90 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
26aa0 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66  pr, dest, destIf
26ab0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
26ac0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
26ad0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
26ae0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
26af0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26b00 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
26b10 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
26b20 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20  ult_expr: .     
26b30 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
26b40 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
26b50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
26b60 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
26b70 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
26b80 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
26b90 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
26ba0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
26bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26bc0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
26bd0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
26be0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
26bf0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
26c00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
26c10 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
26c20 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26c30 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
26c40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
26c50 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
26c60 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
26c70 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
26c80 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
26c90 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
26ca0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26cb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
26cc0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
26cd0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
26ce0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
26cf0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
26d00 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
26d10 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45  ** Like sqlite3E
26d20 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78 63  xprIfFalse() exc
26d30 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79 20  ept that a copy 
26d40 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72  is made of pExpr
26d50 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20   before.** code 
26d60 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20  generation, and 
26d70 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c  that copy is del
26d80 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65 20  eted after code 
26d90 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73  generation. This
26da0 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74  .** ensures that
26db0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45   the original pE
26dc0 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64  xpr is unchanged
26dd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26de0 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28  3ExprIfFalseDup(
26df0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
26e00 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
26e10 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e  dest,int jumpIfN
26e20 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ull){.  sqlite3 
26e30 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
26e40 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20  ;.  Expr *pCopy 
26e50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
26e60 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
26e70 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
26e80 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
26e90 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26ea0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70  lse(pParse, pCop
26eb0 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  y, dest, jumpIfN
26ec0 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ull);.  }.  sqli
26ed0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
26ee0 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 0a 2f 2a  , pCopy);.}.../*
26ef0 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
26f00 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
26f10 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
26f20 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
26f30 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
26f40 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
26f50 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
26f60 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
26f70 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
26f80 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
26f90 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
26fa0 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
26fb0 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
26fc0 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
26fd0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
26fe0 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
26ff0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
27000 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
27010 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
27020 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
27030 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
27040 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
27050 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
27060 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
27070 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
27080 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
27090 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69  * The pA side mi
270a0 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f  ght be using TK_
270b0 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68  REGISTER.  If th
270c0 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61  at is the case a
270d0 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20  nd pB is.** not 
270e0 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
270f0 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  R but is otherwi
27100 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74  se equivalent, t
27110 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
27120 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69   0..**.** Someti
27130 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
27140 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
27150 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
27160 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
27170 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
27180 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
27190 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
271a0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
271b0 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
271c0 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
271d0 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
271e0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
271f0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
27200 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
27210 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
27220 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
27230 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
27240 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
27250 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
27260 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
27270 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
27280 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
27290 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
272a0 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
272b0 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
272c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
272d0 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
272e0 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
272f0 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
27300 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
27310 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
27320 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
27330 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
27340 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
27350 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
27360 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
27370 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
27380 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
27390 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
273a0 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75  , int iTab){.  u
273b0 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  32 combinedFlags
273c0 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
273d0 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
273e0 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20  turn pB==pA ? 0 
273f0 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69  : 2;.  }.  combi
27400 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66  nedFlags = pA->f
27410 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73  lags | pB->flags
27420 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  ;.  if( combined
27430 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  Flags & EP_IntVa
27440 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28  lue ){.    if( (
27450 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c  pA->flags&pB->fl
27460 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29  ags&EP_IntValue)
27470 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61  !=0 && pA->u.iVa
27480 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue==pB->u.iValu
27490 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
274a0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
274b0 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
274c0 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
274d0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  p ){.    if( pA-
274e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
274f0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
27500 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
27510 20 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a   pB, iTab)<2 ){.
27520 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
27530 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
27540 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
27550 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
27560 6f 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70  ompare(pA, pB->p
27570 4c 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29 7b  Left, iTab)<2 ){
27580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
27590 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
275a0 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
275b0 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  A->op!=TK_COLUMN
275c0 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41   && pA->op!=TK_A
275d0 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  GG_COLUMN && pA-
275e0 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
275f0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
27600 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
27610 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
27620 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  ICmp(pA->u.zToke
27630 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
27640 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  =0 ) return 2;. 
27650 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
27660 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  cmp(pA->u.zToken
27670 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
27680 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
27690 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  n pA->op==TK_COL
276a0 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20  LATE ? 1 : 2;.  
276b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
276c0 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
276d0 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
276e0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
276f0 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
27700 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d   if( ALWAYS((com
27710 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
27720 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29  TokenOnly)==0) )
27730 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e  {.    if( combin
27740 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73  edFlags & EP_xIs
27750 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
27760 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
27770 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
27780 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
27790 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ft, iTab) ) retu
277a0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
277b0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
277c0 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
277d0 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
277e0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
277f0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
27800 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e  stCompare(pA->x.
27810 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69  pList, pB->x.pLi
27820 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  st, iTab) ) retu
27830 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c  rn 2;.    if( AL
27840 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
27850 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64  ags & EP_Reduced
27860 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f 70 21  )==0) && pA->op!
27870 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
27880 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c      if( pA->iCol
27890 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
278a0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
278b0 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c     if( pA->iTabl
278c0 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20  e!=pB->iTable . 
278d0 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54        && (pA->iT
278e0 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45  able!=iTab || NE
278f0 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d  VER(pB->iTable>=
27900 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  0)) ) return 2;.
27910 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
27920 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
27930 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
27940 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
27950 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
27960 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
27970 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
27980 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
27990 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
279a0 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
279b0 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
279c0 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
279d0 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
279e0 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
279f0 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
27a00 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
27a10 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
27a20 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
27a30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
27a40 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ght return non-z
27a50 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65  ero for equivale
27a60 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54  nt ExprLists.  T
27a70 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65  he.** only conse
27a80 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64  quence will be d
27a90 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
27aa0 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73  tions.  But this
27ab0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74   routine.** must
27ac0 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20   never return 0 
27ad0 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c  if the two ExprL
27ae0 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ist objects are 
27af0 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a  different, or.**
27b00 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77   a malfunction w
27b10 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  ill result..**.*
27b20 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  * Two NULL point
27b30 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
27b40 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ed to be the sam
27b50 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70  e.  But a NULL p
27b60 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73  ointer.** always
27b70 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20   differs from a 
27b80 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  non-NULL pointer
27b90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27ba0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
27bb0 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78  ExprList *pA, Ex
27bc0 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20  prList *pB, int 
27bd0 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iTab){.  int i;.
27be0 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70    if( pA==0 && p
27bf0 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  B==0 ) return 0;
27c00 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
27c10 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pB==0 ) return 1
27c20 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70  ;.  if( pA->nExp
27c30 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72  r!=pB->nExpr ) r
27c40 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69  eturn 1;.  for(i
27c50 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b  =0; i<pA->nExpr;
27c60 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
27c70 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b  *pExprA = pA->a[
27c80 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
27c90 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
27ca0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
27cb0 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f   if( pA->a[i].so
27cc0 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69  rtOrder!=pB->a[i
27cd0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
27ce0 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
27cf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
27d00 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72  re(pExprA, pExpr
27d10 42 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  B, iTab) ) retur
27d20 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
27d30 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
27d40 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20  turn true if we 
27d50 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45  can prove the pE
27d60 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  2 will always be
27d70 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73 0a   true if pE1 is.
27d80 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e  ** true.  Return
27d90 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e   false if we can
27da0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65  not complete the
27db0 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32   proof or if pE2
27dc0 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c   might.** be fal
27dd0 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  se.  Examples:.*
27de0 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  *.**     pE1: x=
27df0 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  =5       pE2: x=
27e00 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
27e10 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
27e20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20     pE1: x>0     
27e30 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
27e40 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
27e50 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
27e60 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70 45  1: x=21       pE
27e70 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20  2: x=21 OR y=43 
27e80 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
27e90 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
27ea0 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20 49  123     pE2: x I
27eb0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
27ec0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
27ed0 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20    pE1: x!=?1    
27ee0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
27ef0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
27f00 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
27f10 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a   x IS NULL  pE2:
27f20 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
27f30 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
27f40 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
27f50 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49 53   ?2    pE2: x IS
27f60 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 75   NOT NULL    Reu
27f70 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  slt: false.**.**
27f80 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20   When comparing 
27f90 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
27fa0 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64 20  between pE1 and 
27fb0 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73 0a  pE2, if pE2 has.
27fc0 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c 30  ** Expr.iTable<0
27fd0 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20 74   then assume a t
27fe0 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76 65  able number give
27ff0 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  n by iTab..**.**
28000 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   When in doubt, 
28010 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52  return false.  R
28020 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69  eturning true mi
28030 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
28040 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76  rmance.** improv
28050 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  ement.  Returnin
28060 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61  g false might ca
28070 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  use a performanc
28080 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74  e reduction, but
28090 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61  .** it will alwa
280a0 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72  ys give the corr
280b0 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69  ect answer and i
280c0 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73  s hence always s
280d0 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  afe..*/.int sqli
280e0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
280f0 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20 45 78  pr(Expr *pE1, Ex
28100 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61  pr *pE2, int iTa
28110 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b){.  if( sqlite
28120 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31  3ExprCompare(pE1
28130 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20  , pE2, iTab)==0 
28140 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
28150 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e  .  }.  if( pE2->
28160 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20  op==TK_OR.   && 
28170 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c  (sqlite3ExprImpl
28180 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32  iesExpr(pE1, pE2
28190 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20  ->pLeft, iTab). 
281a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
281b0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
281c0 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e  sExpr(pE1, pE2->
281d0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 0a  pRight, iTab) ).
281e0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
281f0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
28200 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
28210 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
28220 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f  ISNULL && pE1->o
28230 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20  p!=TK_IS ){.    
28240 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69 74  Expr *pX = sqlit
28250 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
28260 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pE1->pLeft);. 
28270 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 21     testcase( pX!
28280 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  =pE1->pLeft );. 
28290 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
282a0 70 72 43 6f 6d 70 61 72 65 28 70 58 2c 20 70 45  prCompare(pX, pE
282b0 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
282c0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
282d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
282e0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
282f0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
28300 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
28310 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
28320 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
28330 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
28340 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
28350 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
28360 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
28370 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
28380 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
28390 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
283a0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
283b0 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
283c0 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
283d0 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
283e0 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
283f0 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
28400 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
28410 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
28420 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
28430 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
28440 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
28450 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
28460 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
28470 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
28480 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
28490 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
284a0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
284b0 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
284c0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
284d0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
284e0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
284f0 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
28500 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
28510 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
28520 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
28530 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
28540 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
28550 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
28560 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
28570 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
28580 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
28590 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
285a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
285b0 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
285c0 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
285d0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
285e0 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
285f0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
28600 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
28610 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
28620 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
28630 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
28640 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
28650 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
28660 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
28670 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
28680 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
28690 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
286a0 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
286b0 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
286c0 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
286d0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
286e0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
286f0 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
28700 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
28710 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
28720 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
28730 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
28740 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
28750 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
28760 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
28770 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
28780 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
28790 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
287a0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
287b0 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
287c0 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
287d0 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
287e0 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
287f0 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
28800 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
28810 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
28820 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
28830 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
28840 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
28850 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
28860 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
28870 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
28880 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
28890 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
288a0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
288b0 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
288c0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
288d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
288e0 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
288f0 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
28900 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
28910 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
28920 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
28930 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
28940 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
28950 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
28960 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
28970 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
28980 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
28990 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
289a0 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
289b0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
289c0 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
289d0 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
289e0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
289f0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
28a00 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
28a10 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
28a20 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
28a30 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
28a40 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
28a50 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
28a60 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
28a70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
28a80 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
28a90 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
28aa0 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
28ab0 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
28ac0 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
28ad0 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
28ae0 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
28af0 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
28b00 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
28b10 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
28b20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
28b30 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
28b40 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
28b50 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
28b60 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
28b70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
28b80 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
28b90 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
28ba0 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
28bb0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
28bc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
28bd0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
28be0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
28bf0 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
28c00 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
28c10 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
28c20 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
28c30 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
28c40 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
28c50 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
28c60 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
28c70 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
28c80 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
28c90 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
28ca0 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
28cb0 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
28cc0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
28cd0 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
28ce0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
28cf0 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
28d00 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
28d10 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
28d20 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
28d30 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
28d40 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
28d50 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
28d60 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
28d70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
28d80 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
28d90 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
28da0 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
28db0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
28dc0 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
28dd0 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
28de0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
28df0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
28e00 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
28e10 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
28e20 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
28e30 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
28e40 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
28e50 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
28e60 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
28e70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
28e80 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
28e90 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
28ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
28eb0 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
28ec0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
28ed0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28ee0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
28ef0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
28f00 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
28f10 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
28f20 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
28f30 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
28f40 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
28f50 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
28f60 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
28f70 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
28f80 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
28f90 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
28fa0 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
28fb0 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
28fc0 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
28fd0 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
28fe0 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
28ff0 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
29000 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
29010 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
29020 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
29030 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
29040 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
29050 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
29060 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
29070 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
29080 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65  FUNCTION );.  me
29090 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
290a0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
290b0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
290c0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e  SrcCount;.  w.u.
290d0 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
290e0 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
290f0 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
29100 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
29110 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
29120 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
29130 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
29140 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
29150 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
29160 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
29170 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
29180 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
29190 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
291a0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
291b0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
291c0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
291d0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
291e0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
291f0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
29200 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
29210 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
29220 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
29230 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
29240 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
29250 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
29260 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
29270 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
29280 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
29290 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
292a0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
292b0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
292c0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
292d0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
292e0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
292f0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
29300 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
29310 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
29320 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
29330 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
29340 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
29350 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
29360 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
29370 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
29380 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
29390 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
293a0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
293b0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
293c0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
293d0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
293e0 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
293f0 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
29400 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
29410 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
29420 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
29430 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
29440 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
29450 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
29460 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
29470 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
29480 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
29490 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
294a0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
294b0 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
294c0 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
294d0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
294e0 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
294f0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
29500 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
29510 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
29520 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
29530 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
29540 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
29550 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
29560 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
29570 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
29580 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
29590 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
295a0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
295b0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
295c0 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
295d0 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
295e0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
295f0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
29600 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
29610 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
29620 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
29630 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
29640 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
29650 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
29660 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
29670 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
29680 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
29690 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
296a0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
296b0 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
296c0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
296d0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
296e0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
296f0 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
29700 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
29710 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
29720 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
29730 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
29740 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
29750 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
29760 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
29770 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
29780 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
29790 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
297a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
297b0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
297c0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
297d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
297e0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
297f0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
29800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
29810 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
29820 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
29830 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
29840 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
29850 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
29860 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
29870 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
29880 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
29890 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
298a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
298b0 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
298c0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
298d0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
298e0 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
298f0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
29900 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
29910 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
29920 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
29930 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
29940 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
29950 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
29960 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
29970 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
29980 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
29990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
299a0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
299b0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
299c0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
299d0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
299e0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
299f0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
29a00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
29a10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29a20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29a30 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
29a40 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
29a50 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
29a60 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
29a70 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
29a80 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
29a90 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
29aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29ab0 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
29ac0 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
29ad0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
29ae0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
29af0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
29b00 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
29b10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
29b30 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
29b40 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
29b50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
29b60 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
29b70 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
29b80 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
29b90 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
29ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
29bb0 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
29bc0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
29bd0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
29be0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
29c00 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
29c10 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
29c20 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
29c30 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
29c40 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
29c50 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
29c60 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c80 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ca0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
29cb0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
29cd0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
29ce0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
29cf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
29d00 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
29d10 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
29d20 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d40 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
29d50 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
29d60 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
29d70 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
29d80 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
29d90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29da0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
29dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29dd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
29de0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
29df0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
29e00 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
29e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
29e20 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
29e30 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
29e40 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
29e60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29e80 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
29e90 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
29ea0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
29eb0 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
29ec0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
29ed0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
29ee0 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
29ef0 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
29f00 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
29f10 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
29f20 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
29f30 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
29f40 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
29f50 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
29f60 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
29f70 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
29f80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
29f90 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
29fa0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
29fb0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
29fc0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
29fd0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
29fe0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
29ff0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
2a000 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
2a010 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
2a020 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
2a030 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a040 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
2a050 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2a060 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
2a070 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
2a080 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
2a090 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
2a0a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2a0b0 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
2a0c0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
2a0d0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
2a0e0 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
2a0f0 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
2a100 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
2a110 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2a120 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
2a130 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2a140 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2a150 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
2a160 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
2a170 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
2a180 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
2a190 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
2a1a0 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
2a1b0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
2a1c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a1d0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2a1e0 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
2a1f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
2a200 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a210 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a220 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2a230 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2a240 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2a250 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
2a260 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b  pExpr, -1)==0 ){
2a270 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2a280 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
2a290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a2a0 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
2a2b0 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
2a2c0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
2a2d0 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
2a2e0 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
2a2f0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2a300 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
2a310 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
2a320 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
2a330 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
2a340 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
2a350 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
2a360 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
2a370 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
2a380 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2a390 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2a3a0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
2a3b0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
2a3c0 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
2a3d0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2a3e0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
2a3f0 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
2a400 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2a410 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
2a420 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a430 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2a440 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a450 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
2a460 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
2a470 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
2a480 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
2a490 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
2a4a0 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
2a4b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2a4c0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20  >u.zToken, .    
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2a4e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
2a4f0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
2a500 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
2a510 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2a520 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
2a530 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
2a540 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a550 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
2a560 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2a570 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
2a580 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a590 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
2a5a0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
2a5b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a5c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2a5d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
2a5e0 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
2a5f0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
2a600 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
2a610 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
2a620 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a630 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2a640 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2a650 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2a660 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
2a670 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2a680 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
2a690 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ce);.        pEx
2a6a0 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
2a6b0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
2a6c0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
2a6d0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
2a6e0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2a6f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a700 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2a710 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
2a720 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
2a730 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2a740 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
2a750 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2a760 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
2a770 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
2a780 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
2a790 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a7a0 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55  (pWalker);.  UNU
2a7b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
2a7c0 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
2a7d0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2a7e0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
2a7f0 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2a800 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
2a810 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2a820 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
2a830 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
2a840 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
2a850 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
2a860 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
2a870 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
2a880 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
2a890 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
2a8a0 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
2a8b0 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
2a8c0 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
2a8d0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2a8e0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2a8f0 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
2a900 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
2a910 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
2a920 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
2a930 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
2a940 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2a950 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
2a960 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2a970 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
2a980 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
2a990 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
2a9a0 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
2a9b0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2a9c0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2a9d0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2a9e0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2a9f0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2aa00 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
2aa10 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
2aa20 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
2aa30 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2aa40 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
2aa50 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
2aa60 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2aa70 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
2aa80 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
2aa90 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
2aaa0 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
2aab0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2aac0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
2aad0 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
2aae0 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
2aaf0 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
2ab00 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
2ab10 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
2ab20 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
2ab30 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2ab40 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2ab50 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2ab60 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
2ab70 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
2ab80 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
2ab90 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
2aba0 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
2abb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2abc0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2abd0 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
2abe0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
2abf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2ac00 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
2ac10 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
2ac20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
2ac30 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
2ac40 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
2ac50 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
2ac60 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2ac70 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
2ac80 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
2ac90 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
2aca0 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
2acb0 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
2acc0 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
2acd0 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
2ace0 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
2acf0 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
2ad00 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
2ad10 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
2ad20 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
2ad30 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
2ad40 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
2ad50 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
2ad60 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
2ad70 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61   then.** the dea
2ad80 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
2ad90 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
2ada0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
2adb0 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
2adc0 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
2add0 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
2ade0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2adf0 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
2ae00 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2ae10 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
2ae20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2ae30 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
2ae40 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
2ae50 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2ae60 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
2ae70 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
2ae80 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
2ae90 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
2aea0 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
2aeb0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
2aec0 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
2aed0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
2aee0 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
2aef0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
2af00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
2af10 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
2af20 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
2af30 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2af40 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
2af50 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
2af60 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
2af70 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
2af80 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2af90 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
2afa0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2afb0 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
2afc0 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  , n;.  if( nReg=
2afd0 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69  =1 ) return sqli
2afe0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2aff0 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61  arse);.  i = pPa
2b000 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
2b010 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
2b020 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
2b030 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
2b040 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
2b050 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
2b060 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
2b070 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2b080 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
2b090 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2b0a0 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
2b0b0 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
2b0c0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
2b0d0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2b0e0 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
2b0f0 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
2b100 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2b110 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2b120 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
2b130 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20  nt nReg){.  if( 
2b140 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73  nReg==1 ){.    s
2b150 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2b160 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
2b170 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  g);.    return;.
2b180 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
2b190 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
2b1a0 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29  rse, iReg, nReg)
2b1b0 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61  ;.  if( nReg>pPa
2b1c0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29  rse->nRangeReg )
2b1d0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  {.    pParse->nR
2b1e0 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a  angeReg = nReg;.
2b1f0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
2b200 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  geReg = iReg;.  
2b210 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  }.}../*.** Mark 
2b220 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65  all temporary re
2b230 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67  gisters as being
2b240 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72   unavailable for
2b250 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   reuse..*/.void 
2b260 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2b270 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a  RegCache(Parse *
2b280 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
2b290 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b  e->nTempReg = 0;
2b2a0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  .  pParse->nRang
2b2b0 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  eReg = 0;.}../*.
2b2c0 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74  ** Validate that
2b2d0 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65   no temporary re
2b2e0 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74  gister falls wit
2b2f0 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66  hin the range of
2b300 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73  .** iFirst..iLas
2b310 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54  t, inclusive.  T
2b320 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
2b330 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69  nly call from wi
2b340 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a  thin assert().**
2b350 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
2b360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2b370 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  BUG.int sqlite3N
2b380 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61  oTempsInRange(Pa
2b390 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2b3a0 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61   iFirst, int iLa
2b3b0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
2b3c0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  if( pParse->nRan
2b3d0 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50  geReg>0.   && pP
2b3e0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b  arse->iRangeReg+
2b3f0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2b400 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20 70 50  g<iLast.   && pP
2b410 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3e  arse->iRangeReg>
2b420 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20 20 20  =iFirst.  ){.   
2b430 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2b440 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2b450 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69  rse->nTempReg; i
2b460 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
2b470 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2b480 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61 72  >=iFirst && pPar
2b490 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c  se->aTempReg[i]<
2b4a0 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  =iLast ){.      
2b4b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
2b4c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
2b4d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2b4e0 54 45 5f 44 45 42 55 47 20 2a 2f 0a              TE_DEBUG */.