/ Hex Artifact Content
Login

Artifact 1df03961abc008b46154edca14bcbb38e7a3be90:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
07c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
07d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
07e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61  return sqlite3Ta
07f0: 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
0800: 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  y(pExpr->pTab, p
0810: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0820: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0830: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0850: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
0860: 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  s&EP_xIsSelect )
0870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
0880: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0890: 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  (.        pExpr-
08a0: 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63  >pLeft->x.pSelec
08b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
08c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
08d0: 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  pr.    );.  }.  
08e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
08f0: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0900: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0910: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0920: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0930: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0940: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
0950: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
0960: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
0970: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
0980: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
0990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
09a0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
09b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
09c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
09d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
09e0: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
09f0: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0a00: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0a20: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0a30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0a40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0a50: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  Token(.  Parse *
0a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0a70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
0a80: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
0a90: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
0aa0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43     /* Add the "C
0ab0: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74  OLLATE" clause t
0ac0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
0ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  n */.  const Tok
0ae0: 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20  en *pCollName,  
0af0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
0b00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
0b10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b30: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 70  rue to dequote p
0b40: 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  CollName */.){. 
0b50: 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e   if( pCollName->
0b60: 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  n>0 ){.    Expr 
0b70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
0b80: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
0b90: 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c  >db, TK_COLLATE,
0ba0: 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75   pCollName, dequ
0bb0: 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ote);.    if( pN
0bc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0bd0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0be0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0bf0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0c00: 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20  |EP_Skip;.      
0c10: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
0c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0c30: 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a   pExpr;.}.Expr *
0c40: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0c50: 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72 73  llateString(Pars
0c60: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0c70: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
0c80: 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e  ar *zC){.  Token
0c90: 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   s;.  assert( zC
0ca0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
0cb0: 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28 63  TokenInit(&s, (c
0cc0: 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75  har*)zC);.  retu
0cd0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 64  rn sqlite3ExprAd
0ce0: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0cf0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 2c  arse, pExpr, &s,
0d00: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b   0);.}../*.** Sk
0d10: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0d20: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
0d30: 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c   and any unlikel
0d40: 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69  y().** or likeli
0d50: 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  hood() function 
0d60: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  at the root of a
0d70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  n expression..*/
0d80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78  prSkipCollate(Ex
0da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68  pr *pExpr){.  wh
0db0: 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78  ile( pExpr && Ex
0dc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0dd0: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0de0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e30: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0e40: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0e50: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0e60: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0e80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0e90: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0ea0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0ed0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0ef0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
0f00: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0f10: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
0f20: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0f30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0f50: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0f60: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0f70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0f80: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0f90: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0fa0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0fb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0fc0: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0fe0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0ff0: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
1000: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
1010: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
1020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1030: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
1040: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
1050: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
1060: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
1070: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
1080: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
1090: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
10a0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
10b0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10d0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
10e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1100: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
1110: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
1120: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( p ){.    int o
1130: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69  p = p->op;.    i
1140: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1150: 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b  _Generic ) break
1160: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ;.    if( op==TK
1170: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1180: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1190: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
11a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
11c0: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
11d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
11e0: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
11f0: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1220: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1230: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1250: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
1260: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1270: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1280: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1290: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
12a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26  TRIGGER).     &&
12b0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
12c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
12d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
12e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
12f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1300: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1310: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1320: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1330: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1340: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
1360: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1370: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1390: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
13a0: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
13b0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13e0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1420: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1430: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1440: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
1450: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1460: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1470: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1490: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
14a0: 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b  xt  = p->pRight;
14b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
14c0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
14d0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
14e0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
14f0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
1500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1510: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1520: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1530: 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61         /* p->fla
1540: 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c  gs holds EP_Coll
1550: 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74  ate and p->pLeft
1560: 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74  ->flags does not
1570: 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a  .  And.        *
1580: 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63  * p->x.pSelect c
1590: 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d  annot.  So if p-
15a0: 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c  >x.pLeft exists,
15b0: 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74   it must hold at
15c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73  .        ** leas
15d0: 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65  t one EP_Collate
15e0: 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f  . Thus the follo
15f0: 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e  wing two ALWAYS.
1600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1610: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
1620: 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61 73   ALWAYS(!ExprHas
1630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
1640: 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20  IsSelect)) ){.  
1650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1660: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1670: 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e  ; ALWAYS(i<p->x.
1680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69  pList->nExpr); i
1690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16b0: 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  erty(p->x.pList-
16c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[i].pExpr, EP_
16d0: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
16e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20            pNext 
16f0: 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  = p->x.pList->a[
1700: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1740: 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70   }.        p = p
1750: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1790: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
17a0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
17b0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
17c0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
17e0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
17f0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1800: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1810: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1820: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1830: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1850: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1860: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1870: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1880: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1890: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
18a0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
18b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
18c0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
18d0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
18e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
18f0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1900: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1910: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1920: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1930: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1940: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1950: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1960: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1970: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1980: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
19a0: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
19b0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
19c0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
19d0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
19e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1a20: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1a30: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1a40: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1a50: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1a60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1a70: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1a80: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1a90: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1aa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1ac0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ad0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ae0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1af0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1b00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1b10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1b20: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1b30: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1b40: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1b50: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1b60: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1b70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1b80: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1b90: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1ba0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1bb0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1bc0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1bd0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1be0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1bf0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1c00: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
1c10: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1c20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1c30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1c40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1c50: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1c60: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1c70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1c80: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1c90: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1ca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
1cd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
1ce0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1cf0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
1d00: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
1d10: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1d30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d40: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1d50: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1d60: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d70: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1d80: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1d90: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1da0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1db0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1dc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1dd0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1de0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1df0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1e00: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
1e10: 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 61 66  lse if( NEVER(af
1e20: 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 61 66 66  f==0) ){.    aff
1e30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
1e40: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
1e50: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
1e60: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
1e70: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
1e80: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
1e90: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1ea0: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1eb0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1ec0: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1ed0: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1ee0: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1ef0: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1f00: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1f10: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1f20: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1f30: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
1f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
1f50: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
1f60: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
1f70: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
1f80: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
1f90: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1fa0: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1fb0: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1fc0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ff0: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
2000: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
2010: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
2020: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
2030: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2040: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
2050: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
2060: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
2070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2080: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
2090: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
20a0: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
20b0: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
20c0: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
20d0: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
20e0: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
20f0: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
2100: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
2110: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
2120: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
2130: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
2140: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
2150: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
2160: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
2170: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
2180: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
2190: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
21a0: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
21b0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
21c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
21e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
21f0: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2200: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
2210: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
2220: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
2230: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
2240: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
2250: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
2260: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
2270: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2280: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
2290: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
22a0: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
22b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
22c0: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
22d0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
22e0: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
22f0: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
2300: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
2310: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
2320: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
2330: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
2340: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
2350: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
2360: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
2370: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
2380: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
2390: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
23a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
23b0: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
23c0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
23d0: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
23e0: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
23f0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
2400: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
2410: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
2420: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2430: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
2440: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2450: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2460: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
2470: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
2480: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2490: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
24a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
24b0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
24c0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
24e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2500: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
2510: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
2520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2530: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2540: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
2550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
2560: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
2570: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
2580: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
2590: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
25a0: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
25b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
25d0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
25e0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
25f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2600: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2610: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2620: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2630: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2640: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2650: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2660: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2670: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2680: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2690: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
26a0: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
26b0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
26c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
26d0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
26e0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
26f0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2700: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2710: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2720: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2730: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2740: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2750: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2760: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2770: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2780: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2790: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
27a0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
27b0: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
27c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27e0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
27f0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2820: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2830: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2840: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2850: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
2860: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
2870: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2880: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2890: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 6f 72   is a vector, or
28a0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
28b0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72  ..**.** A vector
28c0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 61   is defined as a
28d0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
28e0: 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20 74 77  at results in tw
28f0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c  o or more.** col
2900: 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74 2e 20  umns of result. 
2910: 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54 4f 52   Every TK_VECTOR
2920: 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65 63 74   node is an vect
2930: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  or because the.*
2940: 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f  * parser will no
2950: 74 20 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f  t generate a TK_
2960: 56 45 43 54 4f 52 20 77 69 74 68 20 66 65 77 65  VECTOR with fewe
2970: 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74 72 69  r than two entri
2980: 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f  es..** But a TK_
2990: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62 65 20  SELECT might be 
29a0: 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
29b0: 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49 74 20  or a scalar. It 
29c0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69  is only.** consi
29d0: 64 65 72 65 64 20 61 20 76 65 63 74 6f 72 20 69  dered a vector i
29e0: 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f 72 20  f it has two or 
29f0: 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  more result colu
2a00: 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mns..*/.int sqli
2a10: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
2a20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2a40: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
2a50: 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pr)>1;.}../*.** 
2a60: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
2a70: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
2a80: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
2a90: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
2aa0: 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  OR .** return th
2ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72  e number of expr
2ac0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 76  essions in the v
2ad0: 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68  ector. Or, if th
2ae0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
2af0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
2b00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2b10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2b20: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
2b30: 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65   For.** any othe
2b40: 72 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  r type of expres
2b50: 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a  sion, return 1..
2b60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45 78 70  prVectorSize(Exp
2b80: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 38 20  r *pExpr){.  u8 
2b90: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
2ba0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
2bb0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78  ISTER ) op = pEx
2bc0: 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f  pr->op2;.  if( o
2bd0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a  p==TK_VECTOR ){.
2be0: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
2bf0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2c00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c10: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2c20: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
2c30: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2c40: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c50: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
2c60: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
2c70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2c80: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75  QUERY./*.** Retu
2c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2ca0: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  a subexpression 
2cb0: 6f 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20  of pVector that 
2cc0: 69 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63  is the i-th.** c
2cd0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
2ce0: 74 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74  tor (numbered st
2cf0: 61 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20  arting with 0). 
2d00: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2d10: 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20  .** ensure that 
2d20: 69 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67  i is within rang
2d30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  e..**.** If pVec
2d40: 74 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tor is really a 
2d50: 73 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61  scalar (and "sca
2d60: 6c 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64  lar" here includ
2d70: 65 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  es subqueries.**
2d80: 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73   that return a s
2d90: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74  ingle column!) t
2da0: 68 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74  hen return pVect
2db0: 6f 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  or unmodified..*
2dc0: 2a 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74  *.** pVector ret
2dd0: 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f  ains ownership o
2de0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  f the returned s
2df0: 75 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  ubexpression..**
2e00: 0a 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f  .** If the vecto
2e10: 72 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e  r is a (SELECT .
2e20: 2e 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70  ..) then the exp
2e30: 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
2e40: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20   is.** just the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  expression for t
2e60: 68 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20  he i-th term of 
2e70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
2e80: 61 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62  and may.** not b
2e90: 65 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c  e ready for eval
2ea0: 75 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74  uation because t
2eb0: 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
2ec0: 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62  has not yet.** b
2ed0: 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a  een positioned..
2ee0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2ef0: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
2f00: 70 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  pr(Expr *pVector
2f10: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2f20: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2f30: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2f40: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2f50: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2f60: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2f70: 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f    assert( pVecto
2f80: 72 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65  r->op2==0 || pVe
2f90: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ctor->op==TK_REG
2fa0: 49 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28  ISTER );.    if(
2fb0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
2fc0: 5f 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74  _SELECT || pVect
2fd0: 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45  or->op2==TK_SELE
2fe0: 43 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  CT ){.      retu
2ff0: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53  rn pVector->x.pS
3000: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
3010: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
3020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
3030: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c  rn pVector->x.pL
3040: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
3050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3060: 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 23  urn pVector;.}.#
3070: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
3080: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
3090: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 23 69 66 6e  BQUERY) */..#ifn
30a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30b0: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 43  SUBQUERY./*.** C
30c0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
30d0: 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f 62 6a  n a new Expr obj
30e0: 65 63 74 20 77 68 69 63 68 20 77 68 65 6e 20 70  ect which when p
30f0: 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69  assed to.** sqli
3100: 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 77 69  te3ExprCode() wi
3110: 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c 6c 20  ll generate all 
3120: 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65 20 74  necessary code t
3130: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
3140: 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d   iField-th colum
3150: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
3160: 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65 63 74  expression pVect
3170: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  or..**.** It is 
3180: 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72 20 74  ok for pVector t
3190: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 28 61  o be a scalar (a
31a0: 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65 6c 64  s long as iField
31b0: 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68  ==0).  .** In th
31c0: 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  at case, this ro
31d0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
31e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
31f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
3200: 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72 65 74  ler owns the ret
3210: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3220: 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f 6e 73  t and is respons
3230: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75  ible for.** ensu
3240: 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ring that the re
3250: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65 76 65  turned value eve
3260: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
3270: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ed..**.** The ca
3280: 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f 77 6e  ller retains own
3290: 65 72 73 68 69 70 20 6f 66 20 70 56 65 63 74 6f  ership of pVecto
32a0: 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  r.  If pVector i
32b0: 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a  s a TK_SELECT,.*
32c0: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
32d0: 6e 65 64 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ned object will 
32e0: 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74 6f  reference pVecto
32f0: 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f 72  r and so pVector
3300: 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20   must remain.** 
3310: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c 69  valid for the li
3320: 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  fe of the return
3330: 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 70  ed object.  If p
3340: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 56  Vector is a TK_V
3350: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63  ECTOR.** or a sc
3360: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  alar expression,
3370: 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65 20   then it can be 
3380: 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e 20  deleted as soon 
3390: 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  as this routine.
33a0: 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ** returns..**.*
33b0: 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61 75  * A trick to cau
33c0: 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 70  se a TK_SELECT p
33d0: 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65 6c  Vector to be del
33e0: 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  eted together wi
33f0: 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  th.** the return
3400: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 69  ed Expr object i
3410: 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20  s to attach the 
3420: 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20 70  pVector to the p
3430: 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f  Right field.** o
3440: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 54  f the returned T
3450: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3460: 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Expr object..*/.
3470: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3480: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28  rForVectorField(
3490: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
34a0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
34b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
34c0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20  Expr *pVector,  
34d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
34e0: 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78 70  or.  List of exp
34f0: 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
3500: 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e  b-SELECT */.  in
3510: 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20 20  t iField        
3520: 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75     /* Which colu
3530: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
3540: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b   to return */.){
3550: 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a 20  .  Expr *pRet;. 
3560: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3570: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
3580: 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74     assert( pVect
3590: 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  or->flags & EP_x
35a0: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
35b0: 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43 54  /* The TK_SELECT
35c0: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64  _COLUMN Expr nod
35d0: 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
35e0: 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20   pLeft:         
35f0: 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61 69    pVector contai
3600: 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 2e 20  ning TK_SELECT. 
3610: 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e 0a 20 20   Not deleted..  
3620: 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20 20 20    ** pRight:    
3630: 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64 2e 20        not used. 
3640: 20 42 75 74 20 72 65 63 75 72 73 69 76 65 6c 79   But recursively
3650: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3660: 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20 20 20   iColumn:       
3670: 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c    Index of a col
3680: 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72 0a 20  umn in pVector. 
3690: 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a 20 20 20     ** iTable:   
36a0: 20 20 20 20 20 20 20 30 20 6f 72 20 74 68 65 20         0 or the 
36b0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
36c0: 73 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  s on the LHS of 
36d0: 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74 0a 20 20  an assignment.  
36e0: 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54 61 62    ** pLeft->iTab
36f0: 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e 20 61  le:   First in a
3700: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
3710: 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ter holding resu
3720: 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a 2a 20  lt, or 0.    ** 
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
3750: 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70 75 74  s not yet comput
3760: 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
3770: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  * sqlite3ExprDel
3780: 65 74 65 28 29 20 73 70 65 63 69 66 69 63 61 6c  ete() specifical
3790: 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72 65 63  ly skips the rec
37a0: 75 72 73 69 76 65 20 64 65 6c 65 74 65 20 6f 66  ursive delete of
37b0: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20 6f 6e  .    ** pLeft on
37c0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
37d0: 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20 70 52  N nodes.  But pR
37e0: 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64  ight is followed
37f0: 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20 20 20  , so pVector.   
3800: 20 2a 2a 20 63 61 6e 20 62 65 20 61 74 74 61 63   ** can be attac
3810: 68 65 64 20 74 6f 20 70 52 69 67 68 74 20 74 6f  hed to pRight to
3820: 20 63 61 75 73 65 20 74 68 69 73 20 6e 6f 64 65   cause this node
3830: 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65 72 73 68   to take ownersh
3840: 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20 70 56 65  ip of.    ** pVe
3850: 63 74 6f 72 2e 20 20 54 79 70 69 63 61 6c 6c 79  ctor.  Typically
3860: 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6d   there will be m
3870: 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c 45 43  ultiple TK_SELEC
3880: 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20  T_COLUMN nodes. 
3890: 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73     ** with the s
38a0: 61 6d 65 20 70 4c 65 66 74 20 70 6f 69 6e 74 65  ame pLeft pointe
38b0: 72 20 74 6f 20 74 68 65 20 70 56 65 63 74 6f 72  r to the pVector
38c0: 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f  , but only one o
38d0: 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 77 69  f them.    ** wi
38e0: 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56 65 63 74  ll own the pVect
38f0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  or..    */.    p
3900: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  Ret = sqlite3PEx
3910: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45  pr(pParse, TK_SE
3920: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  LECT_COLUMN, 0, 
3930: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  0);.    if( pRet
3940: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   ){.      pRet->
3950: 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64  iColumn = iField
3960: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 70 4c  ;.      pRet->pL
3970: 65 66 74 20 3d 20 70 56 65 63 74 6f 72 3b 0a 20  eft = pVector;. 
3980: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
3990: 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70 52 65 74   pRet==0 || pRet
39a0: 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  ->iTable==0 );. 
39b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
39c0: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
39d0: 56 45 43 54 4f 52 20 29 20 70 56 65 63 74 6f 72  VECTOR ) pVector
39e0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
39f0: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
3a00: 45 78 70 72 3b 0a 20 20 20 20 70 52 65 74 20 3d  Expr;.    pRet =
3a10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3a20: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56 65 63  pParse->db, pVec
3a30: 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  tor, 0);.  }.  r
3a40: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
3a50: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 28  ndif /* !define(
3a60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3a70: 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UERY) */../*.** 
3a80: 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
3a90: 78 70 72 20 69 73 20 6f 66 20 74 79 70 65 20 54  xpr is of type T
3aa0: 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61  K_SELECT, genera
3ab0: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
3ac0: 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72  ate.** it. Retur
3ad0: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  n the register i
3ae0: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75  n which the resu
3af0: 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72  lt is stored (or
3b00: 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62  , if the .** sub
3b10: 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
3b20: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
3b30: 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20  lumn, the first 
3b40: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f  in an array.** o
3b50: 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77  f registers in w
3b60: 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  hich the result 
3b70: 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a  is stored)..**.*
3b80: 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f  * If pExpr is no
3b90: 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78  t a TK_SELECT ex
3ba0: 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e  pression, return
3bb0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
3bc0: 74 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  t exprCodeSubsel
3bd0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
3be0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
3bf0: 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a  .  int reg = 0;.
3c00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3c10: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
3c20: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
3c30: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
3c40: 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  eg = sqlite3Code
3c50: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
3c60: 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  , pExpr, 0, 0);.
3c70: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
3c80: 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn reg;.}../*.*
3c90: 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74  * Argument pVect
3ca0: 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  or points to a v
3cb0: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
3cc0: 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56   - either a TK_V
3cd0: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53  ECTOR.** or TK_S
3ce0: 45 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72  ELECT that retur
3cf0: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
3d00: 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75   column. This fu
3d10: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
3d20: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  * the register n
3d30: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73  umber of a regis
3d40: 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ter that contain
3d50: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  s the value of.*
3d60: 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64  * element iField
3d70: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a   of the vector..
3d80: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
3d90: 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20   is a TK_SELECT 
3da0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
3db0: 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73   code for it mus
3dc0: 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61  t have .** alrea
3dd0: 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  dy been generate
3de0: 64 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72  d using the expr
3df0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20  CodeSubselect() 
3e00: 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73  routine. In this
3e10: 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74  .** case paramet
3e20: 65 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f  er regSelect sho
3e30: 75 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74  uld be the first
3e40: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
3e50: 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e  registers.** con
3e60: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  taining the resu
3e70: 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73  lts of the sub-s
3e80: 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  elect. .**.** If
3e90: 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74   pVector is of t
3ea0: 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74  ype TK_VECTOR, t
3eb0: 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65  hen code for the
3ec0: 20 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64   requested field
3ed0: 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64  .** is generated
3ee0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  . In this case (
3ef0: 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62  *pRegFree) may b
3f00: 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  e set to the num
3f10: 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70  ber of.** a temp
3f20: 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
3f30: 6f 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  o be freed by th
3f40: 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20  e caller before 
3f50: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
3f60: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
3f70: 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  g, output parame
3f80: 74 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73  ter (*ppExpr) is
3f90: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
3fa0: 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a   the.** Expr obj
3fb0: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3fc0: 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c  g to element iEl
3fd0: 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  em of the vector
3fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ff0: 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74  exprVectorRegist
4000: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
4010: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
4020: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
4030: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
4040: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
4050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
4060: 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74  ector to extract
4070: 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f   element from */
4080: 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20  .  int iField,  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65     /* Field to e
40b0: 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63  xtract from pVec
40c0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  tor */.  int reg
40d0: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20  Select,         
40e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
40f0: 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  t in array of re
4100: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70  gisters */.  Exp
4110: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4130: 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20  OUT: Expression 
4140: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
4150: 20 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20   *pRegFree      
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4170: 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74  OUT: Temp regist
4180: 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b  er to free */.){
4190: 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74  .  u8 op = pVect
41a0: 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74  or->op;.  assert
41b0: 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ( op==TK_VECTOR 
41c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
41d0: 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c  ER || op==TK_SEL
41e0: 45 43 54 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  ECT );.  if( op=
41f0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
4200: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71      *ppExpr = sq
4210: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
4220: 53 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c  Subexpr(pVector,
4230: 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65   iField);.    re
4240: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54  turn pVector->iT
4250: 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d  able+iField;.  }
4260: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
4270: 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45  LECT ){.    *ppE
4280: 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  xpr = pVector->x
4290: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
42a0: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
42b0: 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72  r;.     return r
42c0: 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b  egSelect+iField;
42d0: 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d  .  }.  *ppExpr =
42e0: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73   pVector->x.pLis
42f0: 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78  t->a[iField].pEx
4300: 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  pr;.  return sql
4310: 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
4320: 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72  (pParse, *ppExpr
4330: 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a  , pRegFree);.}..
4340: 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e  /*.** Expression
4350: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
4360: 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74  arison between t
4370: 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73  wo vector values
4380: 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  . Compute.** the
4390: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63   result of the c
43a0: 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c  omparison (1, 0,
43b0: 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72   or NULL) and wr
43c0: 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  ite that.** resu
43d0: 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  lt into register
43e0: 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   dest..**.** The
43f0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74   caller must sat
4400: 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  isfy the followi
4410: 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73  ng preconditions
4420: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45  :.**.**    if pE
4430: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20  xpr->op==TK_IS: 
4440: 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61       op==TK_EQ a
4450: 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55  nd p5==SQLITE_NU
4460: 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45  LLEQ.**    if pE
4470: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4480: 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61  T:   op==TK_NE a
4490: 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55  nd p5==SQLITE_NU
44a0: 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72  LLEQ.**    other
44b0: 77 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20  wise:           
44c0: 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e       op==pExpr->
44d0: 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a  op and p5==0.*/.
44e0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
44f0: 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20  VectorCompare(. 
4500: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4510: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67         /* Code g
4520: 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74  enerator context
4530: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
4540: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
4550: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
4560: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
4570: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20   dest,          
4580: 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
4590: 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lts into this re
45a0: 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f  gister */.  u8 o
45b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
45c0: 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
45d0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38  operator */.  u8
45e0: 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20   p5             
45f0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55      /* SQLITE_NU
4600: 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a  LLEQ or zero */.
4610: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
4620: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4630: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
4640: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78  xpr->pLeft;.  Ex
4650: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
4660: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e  pr->pRight;.  in
4670: 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  t nLeft = sqlite
4680: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
4690: 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b  pLeft);.  int i;
46a0: 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d  .  int regLeft =
46b0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67   0;.  int regRig
46c0: 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78  ht = 0;.  u8 opx
46d0: 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64   = op;.  int add
46e0: 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  rDone = sqlite3V
46f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4700: 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73  ..  if( nLeft!=s
4710: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4720: 53 69 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a  Size(pRight) ){.
4730: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4740: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
4750: 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
4760: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4770: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  }.  assert( pExp
4780: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
4790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
47a0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70   .       || pExp
47b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
47c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
47d0: 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  NOT .       || p
47e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
47f0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4800: 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  _GT .       || p
4810: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
4820: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4830: 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  _GE .  );.  asse
4840: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f  rt( pExpr->op==o
4850: 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d  p || (pExpr->op=
4860: 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b  =TK_IS && op==TK
4870: 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20 20 20  _EQ).           
4880: 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
4890: 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d  TK_ISNOT && op==
48a0: 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65  TK_NE) );.  asse
48b0: 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78  rt( p5==0 || pEx
48c0: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20  pr->op!=op );.  
48d0: 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49  assert( p5==SQLI
48e0: 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78  TE_NULLEQ || pEx
48f0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20  pr->op==op );.. 
4900: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54   p5 |= SQLITE_ST
4910: 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78  OREP2;.  if( opx
4920: 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20  ==TK_LE ) opx = 
4930: 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78  TK_LT;.  if( opx
4940: 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20  ==TK_GE ) opx = 
4950: 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66  TK_GT;..  regLef
4960: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
4970: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c  elect(pParse, pL
4980: 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74  eft);.  regRight
4990: 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65   = exprCodeSubse
49a0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 52 69  lect(pParse, pRi
49b0: 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ght);..  for(i=0
49c0: 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73  ; 1 /*Loop exits
49d0: 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69   by "break"*/; i
49e0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  ++){.    int reg
49f0: 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72  Free1 = 0, regFr
4a00: 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70  ee2 = 0;.    Exp
4a10: 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20  r *pL, *pR; .   
4a20: 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20   int r1, r2;.   
4a30: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
4a40: 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20   i<nLeft );.    
4a50: 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65  if( i>0 ) sqlite
4a60: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
4a70: 50 61 72 73 65 29 3b 0a 20 20 20 20 72 31 20 3d  Parse);.    r1 =
4a80: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4a90: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ter(pParse, pLef
4aa0: 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20 26  t, i, regLeft, &
4ab0: 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pL, &regFree1);.
4ac0: 20 20 20 20 72 32 20 3d 20 65 78 70 72 56 65 63      r2 = exprVec
4ad0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4ae0: 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c 20 72  se, pRight, i, r
4af0: 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20 26 72  egRight, &pR, &r
4b00: 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 63 6f  egFree2);.    co
4b10: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
4b20: 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c 20 72  , pL, pR, opx, r
4b30: 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70 35 29  1, r2, dest, p5)
4b40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4b50: 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
4b60: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4b70: 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65 73 74  OP_Lt);.    test
4b80: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
4b90: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4ba0: 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
4bb0: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4bc0: 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
4bd0: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
4be0: 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  t);.    testcase
4bf0: 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
4c00: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4c10: 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 74 65  ==OP_Ge);.    te
4c20: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
4c30: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4c40: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  f(v,op==OP_Eq);.
4c50: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4c60: 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
4c70: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4c80: 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  _Ne);.    sqlite
4c90: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4ca0: 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
4cb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
4cc0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
4cd0: 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
4ce0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 73 71      if( i>0 ) sq
4cf0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
4d00: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  p(pParse);.    i
4d10: 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b  f( i==nLeft-1 ){
4d20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d30: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 78 3d    }.    if( opx=
4d40: 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =TK_EQ ){.      
4d50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d60: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 64  2(v, OP_IfNot, d
4d70: 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20  est, addrDone); 
4d80: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4d90: 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c  .      p5 |= SQL
4da0: 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20  ITE_KEEPNULL;.  
4db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 78 3d    }else if( opx=
4dc0: 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20 20 20  =TK_NE ){.      
4dd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4de0: 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65 73 74  2(v, OP_If, dest
4df0: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62  , addrDone); Vdb
4e00: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4e10: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
4e20: 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d  _KEEPNULL;.    }
4e30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
4e40: 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  rt( op==TK_LT ||
4e50: 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70   op==TK_GT || op
4e60: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54  ==TK_LE || op==T
4e70: 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 73 71  K_GE );.      sq
4e80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4e90: 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c  v, OP_ElseNotEq,
4ea0: 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20   0, addrDone);. 
4eb0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
4ec0: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 54  eIf(v, op==TK_LT
4ed0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
4ee0: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
4ef0: 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_GT);.      Vdb
4f00: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
4f10: 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20  p==TK_LE);.     
4f20: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4f30: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20  v, op==TK_GE);. 
4f40: 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66       if( i==nLef
4f50: 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a  t-2 ) opx = op;.
4f60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
4f70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
4f80: 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65 29  bel(v, addrDone)
4f90: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
4fa0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
4fb0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
4fc0: 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67  t argument nHeig
4fd0: 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ht is less than 
4fe0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
4ff0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65  maximum.** expre
5000: 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f  ssion depth allo
5010: 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  wed. If it is no
5020: 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  t, leave an erro
5030: 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20  r message in.** 
5040: 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  pParse..*/.int s
5050: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
5060: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
5070: 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74  rse, int nHeight
5080: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
5090: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d  LITE_OK;.  int m
50a0: 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73 65  xHeight = pParse
50b0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
50c0: 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
50d0: 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65  EPTH];.  if( nHe
50e0: 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b  ight>mxHeight ){
50f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5100: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
5110: 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e       "Expression
5120: 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72   tree is too lar
5130: 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74  ge (maximum dept
5140: 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74  h %d)", mxHeight
5150: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
5160: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5170: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5180: 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  }../* The follow
5190: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
51a0: 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70  ons, heightOfExp
51b0: 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70  r(), heightOfExp
51c0: 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68  rList().** and h
51d0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c  eightOfSelect(),
51e0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74   are used to det
51f0: 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d  ermine the maxim
5200: 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20  um height.** of 
5210: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
5220: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  ree referenced b
5230: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
5240: 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
5250: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
5260: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d  .**.** If this m
5270: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73  aximum height is
5280: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
5290: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
52a0: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
52b0: 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73   pnHeight, the s
52c0: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c  econd parameter,
52d0: 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69   then set *pnHei
52e0: 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  ght to that.** v
52f0: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
5300: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5310: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
5320: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
5330: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
5340: 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67  >nHeight>*pnHeig
5350: 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48  ht ){.      *pnH
5360: 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67  eight = p->nHeig
5370: 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ht;.    }.  }.}.
5380: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5390: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70  htOfExprList(Exp
53a0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70  rList *p, int *p
53b0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
53c0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
53d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
53e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
53f0: 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70       heightOfExp
5400: 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  r(p->a[i].pExpr,
5410: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5420: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
5430: 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  oid heightOfSele
5440: 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
5450: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5460: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69  if( p ){.    hei
5470: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
5480: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
5490: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
54a0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
54b0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54c0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
54d0: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
54e0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
54f0: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65  p->pOffset, pnHe
5500: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5510: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5520: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
5530: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5540: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
5550: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5560: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5570: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
5580: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5590: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
55a0: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
55b0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
55c0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
55d0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
55e0: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
55f0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5600: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5610: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5620: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5630: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
5640: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
5650: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
5660: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
5670: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
5680: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
5690: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
56a0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
56b0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
56c0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
56d0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
56e0: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
56f0: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5700: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5710: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5720: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5740: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5750: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5760: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5770: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5780: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5790: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
57a0: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
57b0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
57c0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
57d0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
57e0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
57f0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5800: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5810: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5820: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5830: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5840: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5850: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5860: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5870: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5880: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5890: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
58a0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
58b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
58c0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
58d0: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
58e0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
58f0: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5900: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5910: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5920: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5930: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5940: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5950: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5960: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5970: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5980: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5990: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
59a0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
59b0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
59c0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
59d0: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
59e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
59f0: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5a00: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5a10: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5a20: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5a30: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5a40: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5a50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5a60: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5a70: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5a80: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5a90: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5aa0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5ab0: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5ac0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5ad0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5ae0: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5af0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5b00: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5b10: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5b20: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5b30: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5b40: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5b50: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5b60: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5b70: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5b80: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5b90: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5ba0: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5bb0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5bc0: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5bd0: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5be0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5bf0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5c00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5c10: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5c20: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5c30: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5c40: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5c50: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5c60: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5c70: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5c80: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5c90: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
5ca0: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
5cb0: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
5cc0: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
5cd0: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
5ce0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5cf0: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
5d00: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
5d10: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
5d20: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
5d30: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
5d40: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
5d50: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
5d60: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
5d70: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
5d80: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
5d90: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
5da0: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
5db0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
5dc0: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
5dd0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
5de0: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
5df0: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
5e00: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
5e10: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
5e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
5e30: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
5e40: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
5e50: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
5e60: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
5e70: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
5e80: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
5e90: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
5ea0: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
5eb0: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
5ec0: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
5ed0: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
5ee0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
5ef0: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
5f00: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
5f10: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
5f20: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
5f30: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
5f40: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
5f50: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
5f60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
5f70: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
5f80: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
5f90: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
5fa0: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
5fb0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
5fc0: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
5fd0: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
5fe0: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
5ff0: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6000: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6010: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6020: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6030: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
6040: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
6050: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
6060: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
6070: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
6080: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
6090: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
60a0: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
60b0: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
60c0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
60d0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
60e0: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
60f0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6100: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6110: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6120: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6130: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6140: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6150: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6160: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
6170: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
6180: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
6190: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
61a0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
61b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
61c0: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
61d0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
61e0: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
61f0: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6200: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6210: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6220: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6230: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
6240: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
6250: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
6260: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
6270: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
6280: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
6290: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
62a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
62b0: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
62c0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
62d0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
62e0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
62f0: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6300: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6310: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6320: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6330: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
6340: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
6350: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
6360: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
6370: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
6380: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
6390: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
63a0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
63b0: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
63c0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
63d0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
63e0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
63f0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
6400: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
6410: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
6420: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
6430: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
6440: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
6450: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
6460: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
6470: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
6480: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
6490: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
64a0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
64b0: 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28   sqlite3Isquote(
64c0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  pNew->u.zToken[0
64d0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
64e0: 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  if( pNew->u.zTok
64f0: 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65  en[0]=='"' ) pNe
6500: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
6510: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
6520: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
6530: 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  te(pNew->u.zToke
6540: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
6550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
6560: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
6570: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
6580: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
6590: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
65a0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
65b0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
65c0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
65d0: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
65e0: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
65f0: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
6600: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
6610: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
6620: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
6630: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6640: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6650: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6660: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
6670: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
6680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6690: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
66a0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
66b0: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
66c0: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
66d0: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
66e0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
66f0: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
6700: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
6710: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
6720: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
6730: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
6740: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
6750: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
6760: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
6770: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6780: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
6790: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
67a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
67b0: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
67c0: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
67d0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
67e0: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
67f0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
6800: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
6810: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6820: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
6830: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
6840: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
6850: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
6860: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
6870: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
6880: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
6890: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
68a0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
68b0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
68c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
68d0: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
68e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
68f0: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
6900: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
6910: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
6920: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
6930: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f  Right;.      pRo
6940: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6950: 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67  Propagate & pRig
6960: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
6970: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
6980: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
6990: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
69a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
69b0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
69c0: 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b   & pLeft->flags;
69d0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53  .    }.    exprS
69e0: 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b  etHeight(pRoot);
69f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
6a00: 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e  locate an Expr n
6a10: 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20  ode which joins 
6a20: 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73  as many as two s
6a30: 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  ubtrees..**.** O
6a40: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
6a50: 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62  e subtrees can b
6a60: 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20  e NULL.  Return 
6a70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6a80: 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64   new.** Expr nod
6a90: 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  e.  Or, if an OO
6aa0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
6ab0: 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  set pParse->db->
6ac0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a  mallocFailed,.**
6ad0: 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65   free the subtre
6ae0: 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  es and return NU
6af0: 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  LL..*/.Expr *sql
6b00: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
6b10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6b20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
6b30: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6b40: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6b50: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6b60: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
6b70: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
6b80: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
6b90: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
6ba0: 20 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20   *pRight        
6bb0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
6bc0: 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  rand */.){.  Exp
6bd0: 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r *p;.  if( op==
6be0: 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65  TK_AND && pParse
6bf0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
6c00: 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61   /* Take advanta
6c10: 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63  ge of short-circ
6c20: 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69  uit false optimi
6c30: 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a  zation for AND *
6c40: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
6c50: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
6c60: 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  >db, pLeft, pRig
6c70: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
6c80: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
6c90: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
6ca0: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  e->db, sizeof(Ex
6cb0: 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 20  pr));.    if( p 
6cc0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
6cd0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  p, 0, sizeof(Exp
6ce0: 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70  r));.      p->op
6cf0: 20 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41   = op & TKFLG_MA
6d00: 53 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 67  SK;.      p->iAg
6d10: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  g = -1;.    }.  
6d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
6d30: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
6d40: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
6d50: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  , pRight);.  }. 
6d60: 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73   if( p ) {.    s
6d70: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
6d80: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
6d90: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20  >nHeight);.  }. 
6da0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
6db0: 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20  .** Add pSelect 
6dc0: 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53  to the Expr.x.pS
6dd0: 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72  elect field.  Or
6de0: 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55  , if pExpr is NU
6df0: 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20  LL (due.** do a 
6e00: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6e10: 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20  n failure) then 
6e20: 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65  delete the pSele
6e30: 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  ct object..*/.vo
6e40: 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41  id sqlite3PExprA
6e50: 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ddSelect(Parse *
6e60: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
6e70: 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  xpr, Select *pSe
6e80: 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78  lect){.  if( pEx
6e90: 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  pr ){.    pExpr-
6ea0: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  >x.pSelect = pSe
6eb0: 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65  lect;.    ExprSe
6ec0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
6ed0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50   EP_xIsSelect|EP
6ee0: 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  _Subquery);.    
6ef0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
6f00: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
6f10: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d  rse, pExpr);.  }
6f20: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6f30: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
6f40: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6f50: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
6f60: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
6f70: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
6f80: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
6f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
6fa0: 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52 55  lways either TRU
6fb0: 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73 70  E or FALSE (resp
6fc0: 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74 68  ectively),.** th
6fd0: 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  en return 1.  If
6fe0: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74 65   one cannot dete
6ff0: 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68 20  rmine the truth 
7000: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
7010: 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63 6f  expression at co
7020: 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75 72  mpile-time retur
7030: 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  n 0..**.** This 
7040: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
7050: 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f  on.  If is OK to
7060: 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20 65   return 0 here e
7070: 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65 78  ven if.** the ex
7080: 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20  pression really 
7090: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
70a0: 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c 73  or false (a fals
70b0: 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a 20  e negative)..** 
70c0: 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67 20  But it is a bug 
70d0: 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20 74  to return 1 if t
70e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
70f0: 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ght have differe
7100: 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61  nt.** boolean va
7110: 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65 6e  lues in differen
7120: 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20  t circumstances 
7130: 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76  (a false positiv
7140: 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  e.).**.** Note t
7150: 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72 65  hat if the expre
7160: 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ssion is part of
7170: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72   conditional for
7180: 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c   a.** LEFT JOIN,
7190: 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20   then we cannot 
71a0: 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d  determine at com
71b0: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
71c0: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69  r or not.** is i
71d0: 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c  t true or false,
71e0: 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72   so always retur
71f0: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
7200: 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  nt exprAlwaysTru
7210: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
7220: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7230: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7240: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7250: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7260: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7270: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7280: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7290: 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74 69  rn v!=0;.}.stati
72a0: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
72b0: 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a  False(Expr *p){.
72c0: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
72d0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
72e0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
72f0: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
7300: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
7310: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
7320: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
7330: 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a  return v==0;.}..
7340: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65  /*.** Join two e
7350: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
7360: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
7370: 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70  .  If either exp
7380: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55  ression is.** NU
7390: 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  LL, then just re
73a0: 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65  turn the other e
73b0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
73c0: 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   If one side or 
73d0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
73e0: 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   AND is known to
73f0: 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   be false, then 
7400: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65  instead.** of re
7410: 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65  turning an AND e
7420: 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20  xpression, just 
7430: 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e  return a constan
7440: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  t expression wit
7450: 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20  h.** a value of 
7460: 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a  false..*/.Expr *
7470: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73  sqlite3ExprAnd(s
7480: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
7490: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
74a0: 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c  Right){.  if( pL
74b0: 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  eft==0 ){.    re
74c0: 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d  turn pRight;.  }
74d0: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d  else if( pRight=
74e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
74f0: 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20   pLeft;.  }else 
7500: 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
7510: 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78  lse(pLeft) || ex
7520: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
7530: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
7540: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
7550: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
7560: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7570: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
7580: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7590: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
75a0: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
75b0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
75c0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
75d0: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
75e0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
75f0: 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29  b, TK_AND, 0, 0)
7600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7610: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
7620: 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c  db, pNew, pLeft,
7630: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
7640: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  turn pNew;.  }.}
7650: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
7660: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
7670: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
7680: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
7690: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
76a0: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
76b0: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
76c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
76d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
76e0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
76f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
7700: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7710: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
7720: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
7730: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7740: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
7750: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
7760: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
7770: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7780: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7790: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
77a0: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
77b0: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
77c0: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
77d0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
77e0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
77f0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7800: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7810: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7820: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7830: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7840: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
7850: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7860: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
7870: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
7880: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
7890: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
78a0: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
78b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
78c0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
78d0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
78e0: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
78f0: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
7900: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
7910: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
7920: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
7930: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7940: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
7950: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7960: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
7970: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
7980: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
7990: 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64 20  oo big to avoid 
79a0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
79b0: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
79c0: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
79d0: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
79e0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
79f0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
7a00: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7a10: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
7a20: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
7a30: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
7a40: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
7a50: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
7a60: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
7a70: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
7a80: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
7a90: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
7aa0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
7ab0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7ac0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
7ad0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
7ae0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7af0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
7b00: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
7b10: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7b20: 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c 69  , u32 n){.  sqli
7b30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7b40: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
7b50: 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20 78  ar *z;.  ynVar x
7b60: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
7b70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
7b80: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7b90: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7ba0: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
7bb0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
7bc0: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
7bd0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
7be0: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
7bf0: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
7c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
7c10: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
7c20: 28 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31  (z) );.  if( z[1
7c30: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ]==0 ){.    /* W
7c40: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7c50: 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e  orm "?".  Assign
7c60: 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62   the next variab
7c70: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
7c80: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27   assert( z[0]=='
7c90: 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79  ?' );.    x = (y
7ca0: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
7cb0: 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nVar);.  }else{.
7cc0: 20 20 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20      int doAdd = 
7cd0: 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  0;.    if( z[0]=
7ce0: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
7cf0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
7d00: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
7d10: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
7d20: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
7d30: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
7d40: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
7d50: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
7d60: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
7d70: 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33  bOk = 0==sqlite3
7d80: 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69  Atoi64(&z[1], &i
7d90: 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  , n-1, SQLITE_UT
7da0: 46 38 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  F8);.      x = (
7db0: 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74  ynVar)i;.      t
7dc0: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7dd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7de0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7df0: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7e00: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7e10: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7e20: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7e30: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7e40: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7e50: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7e60: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
7e70: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
7e80: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
7e90: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7ea0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7eb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7ec0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7ed0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
7ee0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
7ef0: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7f10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7f20: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7f30: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
7f40: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7f50: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
7f60: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
7f70: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
7f80: 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20  = (int)x;.      
7f90: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
7fa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
7fb0: 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
7fc0: 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
7fd0: 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, x)==0 ){.    
7fe0: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
7ff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8000: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
8010: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
8020: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
8030: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
8040: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
8050: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
8060: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
8070: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
8080: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
8090: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
80a0: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
80b0: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
80c0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
80d0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
80e0: 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56  /.      x = (ynV
80f0: 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  ar)sqlite3VListN
8100: 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d  ameToNum(pParse-
8110: 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a  >pVList, z, n);.
8120: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
8130: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79  {.        x = (y
8140: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8150: 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64  nVar);.        d
8160: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
8170: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8180: 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70  doAdd ){.      p
8190: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
81a0: 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28  sqlite3VListAdd(
81b0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  db, pParse->pVLi
81c0: 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20  st, z, n, x);.  
81d0: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d    }.  }.  pExpr-
81e0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20  >iColumn = x;.  
81f0: 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74  if( x>db->aLimit
8200: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8210: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
8220: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8230: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8240: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
8250: 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ables");.  }.}..
8260: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
8270: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
8280: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
8290: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
82a0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69  INLINE void sqli
82b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
82c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
82d0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
82e0: 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61   p!=0 );.  /* Sa
82f0: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
8300: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
8310: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
8320: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
8330: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
8340: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8350: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
8360: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
8370: 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 );.#ifdef SQLI
8380: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45  TE_DEBUG.  if( E
8390: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
83a0: 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45  , EP_Leaf) && !E
83b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
83c0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
83d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
83e0: 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
83f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
8400: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ght==0 );.    as
8410: 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65  sert( p->x.pSele
8420: 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e  ct==0 );.  }.#en
8430: 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48  dif.  if( !ExprH
8440: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45  asProperty(p, (E
8450: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
8460: 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20  eaf)) ){.    /* 
8470: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
8480: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
8490: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
84a0: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
84b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
84c0: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
84d0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
84e0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
84f0: 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  && p->op!=TK_SEL
8500: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c  ECT_COLUMN ) sql
8510: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
8520: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  (db, p->pLeft);.
8530: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8540: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69  elete(db, p->pRi
8550: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ght);.    if( Ex
8560: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8570: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
8580: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
8590: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
85a0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
85b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
85c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
85d0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
85e0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
85f0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
8600: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
8610: 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33  Token) ) sqlite3
8620: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
8630: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  zToken);.  if( !
8640: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8650: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
8660: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8670: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
8680: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
8690: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
86a0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
86b0: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
86c0: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
86d0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
86e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
86f0: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
8700: 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ed for the expre
8710: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
8720: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
8730: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8740: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
8750: 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c   one of EXPR_FUL
8760: 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52  LSIZE,.** EXPR_R
8770: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58  EDUCEDSIZE or EX
8780: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
87a0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  exprStructSize(E
87b0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45  xpr *p){.  if( E
87c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
87d0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
87e0: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f  ) return EXPR_TO
87f0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69  KENONLYSIZE;.  i
8800: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8810: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8820: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8830: 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72  REDUCEDSIZE;.  r
8840: 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53  eturn EXPR_FULLS
8850: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  IZE;.}../*.** Th
8860: 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65  e dupedExpr*Size
8870: 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68  () routines each
8880: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
8890: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
88a0: 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ired.** to store
88b0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
88c0: 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72  pression or expr
88d0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68  ession tree.  Th
88e0: 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20  ey differ in.** 
88f0: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20  how much of the 
8900: 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64  tree is measured
8910: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65  ..**.**     dupe
8920: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8930: 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e  )     Size of on
8940: 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75  ly the Expr stru
8950: 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75  cture .**     du
8960: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
8970: 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20  )       Size of 
8980: 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72  Expr + space for
8990: 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75   token.**     du
89a0: 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20  pedExprSize()   
89b0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74          Expr + t
89c0: 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63  oken + subtree c
89d0: 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a  omponents.**.***
89e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
89f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
8a30: 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75  he dupedExprStru
8a40: 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f  ctSize() functio
8a50: 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61  n returns two va
8a60: 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74  lues OR-ed toget
8a70: 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68  her:  .** (1) th
8a80: 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
8a90: 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74   for a copy of t
8aa0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
8ab0: 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28  e only and .** (
8ac0: 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c  2) the EP_xxx fl
8ad0: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74  ags that indicat
8ae0: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63  e what the struc
8af0: 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64  ture size should
8b00: 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75   be..** The retu
8b10: 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77  rn values is alw
8b20: 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a  ays one of:.**.*
8b30: 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c  *      EXPR_FULL
8b40: 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50  SIZE.**      EXP
8b50: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20  R_REDUCEDSIZE   
8b60: 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20  | EP_Reduced.** 
8b70: 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f       EXPR_TOKENO
8b80: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
8b90: 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65  enOnly.**.** The
8ba0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72   size of the str
8bb0: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f  ucture can be fo
8bc0: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
8bd0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
8be0: 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ** of this routi
8bf0: 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20  ne with 0xfff.  
8c00: 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65  The flags can be
8c10: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
8c20: 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  g the.** return 
8c30: 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65  value with EP_Re
8c40: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
8c50: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ly..**.** Note t
8c60: 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d  hat with flags==
8c70: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
8c80: 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f  this routines wo
8c90: 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65  rks on full-size
8ca0: 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20  .** (unreduced) 
8cb0: 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20  Expr objects as 
8cc0: 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c  they or original
8cd0: 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ly constructed b
8ce0: 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a  y the parser..**
8cf0: 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69   During expressi
8d00: 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74  on analysis, ext
8d10: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
8d20: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d  s computed and m
8d30: 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74  oved into.** lat
8d40: 65 72 20 70 61 72 74 73 20 6f 66 20 74 65 68 20  er parts of teh 
8d50: 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  Expr object and 
8d60: 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72  that extra infor
8d70: 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74  mation might get
8d80: 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20   chopped.** off 
8d90: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
8da0: 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e  n is reduced.  N
8db0: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74  ote also that it
8dc0: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74   does not work t
8dd0: 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50  o.** make an EXP
8de0: 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79  RDUP_REDUCE copy
8df0: 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78   of a reduced ex
8e00: 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73  pression.  It is
8e10: 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74   only legal.** t
8e20: 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74  o reduce a prist
8e30: 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ine expression t
8e40: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ree from the par
8e50: 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ser.  The implem
8e60: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64  entation.** of d
8e70: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8e80: 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c  ze() contain mul
8e90: 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73  tiple assert() s
8ea0: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61  tatements that a
8eb0: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66  ttempt.** to enf
8ec0: 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72  orce this constr
8ed0: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
8ee0: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
8ef0: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
8f00: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
8f10: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65  nt nSize;.  asse
8f20: 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  rt( flags==EXPRD
8f30: 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61  UP_REDUCE || fla
8f40: 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79  gs==0 ); /* Only
8f50: 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20   one flag value 
8f60: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73  allowed */.  ass
8f70: 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49  ert( EXPR_FULLSI
8f80: 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61  ZE<=0xfff );.  a
8f90: 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20  ssert( (0xfff & 
8fa0: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
8fb0: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
8fc0: 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20  .  if( 0==flags 
8fd0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  || p->op==TK_SEL
8fe0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
8ff0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
9000: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
9010: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
9020: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9030: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
9040: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
9050: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9060: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9070: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
9080: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9090: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
90a0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
90b0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
90c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
90d0: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
90e0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
90f0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
9100: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
9110: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
9120: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
9130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
9140: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
9150: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
9160: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
9170: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
9180: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
9190: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
91a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
91b0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
91c0: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
91d0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
91e0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
91f0: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
9200: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
9210: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
9220: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
9230: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
9240: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
9250: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
9260: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
9270: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
9280: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
9290: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
92a0: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
92b0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
92c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
92d0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
92e0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
92f0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
9300: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9310: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
9320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
9330: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
9340: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9350: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9360: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
9370: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
9380: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
9390: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
93a0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
93b0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
93c0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
93d0: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
93e0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
93f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
9400: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
9410: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
9420: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
9430: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
9440: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
9450: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
9460: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
9470: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
9480: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
9490: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
94a0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
94b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
94c0: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
94d0: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
94e0: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
94f0: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
9500: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
9510: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
9520: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
9530: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
9540: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
9550: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
9560: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
9570: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
9580: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
9590: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
95a0: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
95b0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
95c0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
95d0: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
95e0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
95f0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9600: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
9610: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
9620: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
9630: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
9640: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
9650: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
9660: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
9670: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
9680: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9690: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
96a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
96b0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
96c0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
96d0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
96e0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
96f0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
9700: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
9710: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
9720: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
9730: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
9740: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
9750: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
9760: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
9770: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
9780: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
9790: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
97a0: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
97b0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
97c0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
97d0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
97e0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
97f0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
9800: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
9810: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
9820: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
9830: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
9840: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
9850: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
9860: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
9870: 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20  nt dupFlags, u8 
9880: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
9890: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
98a0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
98b0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20   return */.  u8 
98c0: 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  *zAlloc;        
98d0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
98e0: 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  ce from which to
98f0: 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65   build Expr obje
9900: 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74  ct */.  u32 stat
9910: 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  icFlag;       /*
9920: 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70   EP_Static if sp
9930: 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64  ace not obtained
9940: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a   from malloc */.
9950: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
9960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20   );.  assert( p 
9970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70  );.  assert( dup
9980: 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46  Flags==0 || dupF
9990: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
99a0: 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74  DUCE );.  assert
99b0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
99c0: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
99d0: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20  UP_REDUCE );..  
99e0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
99f0: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
9a00: 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74   new Expr struct
9a10: 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a  ure. */.  if( pz
9a20: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41  Buffer ){.    zA
9a30: 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72  lloc = *pzBuffer
9a40: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
9a50: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
9a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f  }else{.    zAllo
9a70: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
9a80: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70  locRawNN(db, dup
9a90: 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75  edExprSize(p, du
9aa0: 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74  pFlags));.    st
9ab0: 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20  aticFlag = 0;.  
9ac0: 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72  }.  pNew = (Expr
9ad0: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66   *)zAlloc;..  if
9ae0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a  ( pNew ){.    /*
9af0: 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f   Set nNewSize to
9b00: 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61   the size alloca
9b10: 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75  ted for the stru
9b20: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
9b30: 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e  .    ** by pNew.
9b40: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
9b50: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
9b60: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
9b70: 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  or.    ** EXPR_T
9b80: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
9b90: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
9ba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
9bb0: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
9bc0: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
9bd0: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
9be0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
9bf0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  )..    */.    co
9c00: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
9c10: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
9c20: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
9c30: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
9c40: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
9c50: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
9c60: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69  e & 0xfff;.    i
9c70: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  nt nToken;.    i
9c80: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
9c90: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
9ca0: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
9cb0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  en ){.      nTok
9cc0: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
9cd0: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
9ce0: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ) + 1;.    }else
9cf0: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
9d00: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
9d10: 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20  ( dupFlags ){.  
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
9d30: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9d40: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
9d50: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
9d60: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
9d70: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9d80: 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d       u32 nSize =
9d90: 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74   (u32)exprStruct
9da0: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d  Size(p);.      m
9db0: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
9dc0: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69   nSize);.      i
9dd0: 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55  f( nSize<EXPR_FU
9de0: 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20  LLSIZE ){ .     
9df0: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
9e00: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
9e10: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
9e20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9e30: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
9e40: 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f   EP_Reduced, EP_
9e50: 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45  TokenOnly, and E
9e60: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61  P_Static flags a
9e70: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
9e80: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9e90: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
9ea0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
9eb0: 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f  _Static|EP_MemTo
9ec0: 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ken);.    pNew->
9ed0: 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74  flags |= nStruct
9ee0: 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63  Size & (EP_Reduc
9ef0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
9f00: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
9f10: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
9f20: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
9f30: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
9f40: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
9f50: 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
9f60: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
9f70: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
9f80: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
9f90: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
9fa0: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
9fb0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
9fc0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
9fd0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
9fe0: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
9ff0: 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f  >flags) & (EP_To
a000: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a010: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a020: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a030: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a040: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a050: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a060: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a070: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a080: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a090: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a0a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a0b0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a0c0: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0e0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a0f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a100: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a110: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a120: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a130: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a140: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a150: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a160: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a170: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a180: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a190: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a1a0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a1b0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a1c0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a1d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a1e0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a1f0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a200: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a210: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a220: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a230: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a240: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a250: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a260: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a270: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a280: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a2b0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a2c0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a2d0: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a2e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a    }.      if( pz
a2f0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a300: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a310: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a330: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a340: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
a350: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a360: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
a370: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
a380: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a390: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a3a0: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
a3b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a3c0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70  >iColumn==0 || p
a3d0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
a3e0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a3f0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c   p->pRight==0  |
a400: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e  | p->pRight==p->
a410: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
a420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a430: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a440: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a450: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
a460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a470: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a480: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a490: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a4a0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a4b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a4c0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
a4d0: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
a4e0: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
a4f0: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
a500: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
a510: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
a520: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
a530: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
a540: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a550: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
a560: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
a570: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
a580: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a590: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
a5a0: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
a5b0: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
a5c0: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
a5d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
a5e0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
a5f0: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
a600: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
a610: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
a620: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a630: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
a640: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
a650: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a660: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
a670: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
a680: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a690: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
a6a0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a6b0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a6c0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a6d0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
a6e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a6f0: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
a700: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a710: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
a720: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
a730: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
a740: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a750: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
a760: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
a770: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a780: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
a790: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
a7a0: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
a7b0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a7c0: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
a7d0: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
a7e0: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
a7f0: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
a800: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
a810: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
a820: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
a830: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
a840: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
a850: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
a860: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
a870: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
a880: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
a890: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
a8a0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
a8b0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
a8c0: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
a8d0: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
a8e0: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
a8f0: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
a900: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
a910: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
a920: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
a930: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
a940: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
a950: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
a960: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
a970: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
a980: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
a990: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
a9a0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
a9b0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
a9c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
a9d0: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
a9e0: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
a9f0: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
aa00: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
aa10: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
aa20: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
aa30: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
aa40: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
aa50: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
aa60: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
aa70: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
aa80: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
aa90: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
aaa0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
aab0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
aac0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
aad0: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
aae0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
aaf0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
ab00: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
ab10: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
ab20: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
ab30: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
ab40: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
ab50: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
ab60: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
ab70: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
ab80: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
ab90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
aba0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
abb0: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
abc0: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
abd0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
abe0: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
abf0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
ac00: 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43  r *pPriorSelectC
ac10: 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ol = 0;.  assert
ac20: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
ac30: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
ac40: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
ac50: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
ac60: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
ac70: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
ac80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ac90: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69   pNew->nExpr = i
aca0: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69   = p->nExpr;.  i
acb0: 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50 52  f( (flags & EXPR
acc0: 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29  DUP_REDUCE)==0 )
acd0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e   for(i=1; i<p->n
ace0: 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20  Expr; i+=i){}.  
acf0: 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20  pNew->a = pItem 
ad00: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ad10: 63 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73 69  cRawNN(db,  i*si
ad20: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
ad30: 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20  .  if( pItem==0 
ad40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
ad50: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
ad60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ad70: 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  } .  pOldItem = 
ad80: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
ad90: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
ada0: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
adb0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
adc0: 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c   *pOldExpr = pOl
add0: 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  dItem->pExpr;.  
ade0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
adf0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
ae00: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
ae10: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
ae20: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
ae30: 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20 20 20  ( pOldExpr .    
ae40: 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70   && pOldExpr->op
ae50: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
ae60: 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e 65 77  MN.     && (pNew
ae70: 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
ae80: 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  xpr)!=0 .    ){.
ae90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
aea0: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
aeb0: 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20  =0 || i>0 );.   
aec0: 20 20 20 69 66 28 20 70 4e 65 77 45 78 70 72 2d     if( pNewExpr-
aed0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >iColumn==0 ){. 
aee0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
aef0: 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  OldExpr->pLeft==
af00: 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67 68 74  pOldExpr->pRight
af10: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
af20: 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e  orSelectCol = pN
af30: 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ewExpr->pLeft = 
af40: 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67 68 74  pNewExpr->pRight
af50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
af60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
af70: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
af80: 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e  sert( pItem[-1].
af90: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
afa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
afb0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
afc0: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e  Item[-1].pExpr->
afd0: 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20  iColumn+1 );.   
afe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
aff0: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49  iorSelectCol==pI
b000: 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70  tem[-1].pExpr->p
b010: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Left );.        
b020: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b030: 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f  = pPriorSelectCo
b040: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b050: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
b060: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b070: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b080: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
b090: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
b0a0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b0b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
b0c0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
b0d0: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
b0e0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
b0f0: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
b100: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62   0;.    pItem->b
b110: 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64  SpanIsTab = pOld
b120: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
b130: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
b140: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
b150: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
b160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
b170: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
b180: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
b190: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
b1a0: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
b1b0: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
b1c0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
b1d0: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
b1e0: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
b1f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
b200: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
b210: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b220: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
b230: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
b240: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
b250: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
b260: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
b270: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
b280: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
b290: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
b2a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
b2b0: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
b2c0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
b2d0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
b2e0: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
b2f0: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
b300: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
b310: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
b320: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
b330: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b340: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
b350: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
b360: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
b370: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
b380: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
b390: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
b3a0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b3b0: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
b3c0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
b3d0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
b3e0: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
b3f0: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
b400: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
b410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
b420: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b430: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
b440: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
b450: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b460: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
b470: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
b480: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
b490: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
b4a0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
b4b0: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
b4c0: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
b4d0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b4e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
b4f0: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
b500: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b510: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b520: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b530: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b540: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
b550: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b560: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
b570: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66  .    pNewItem->f
b580: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67  g = pOldItem->fg
b590: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b5a0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
b5b0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
b5c0: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
b5d0: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
b5e0: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
b5f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
b600: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
b610: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
b620: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
b630: 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
b640: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
b650: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
b660: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b670: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b680: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
b690: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
b6a0: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  tem->pIBIndex = 
b6b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pOldItem->pIBInd
b6c0: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ex;.    if( pNew
b6d0: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
b6e0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nc ){.      pNew
b6f0: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
b700: 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  g = .          s
b710: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b720: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b730: 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61  u1.pFuncArg, fla
b740: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  gs);.    }.    p
b750: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
b760: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
b770: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
b780: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
b790: 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
b7a0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
b7b0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
b7c0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
b7d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
b7e0: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
b7f0: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
b800: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b810: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
b820: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
b830: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
b840: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
b850: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b860: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
b870: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
b880: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
b890: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
b8a0: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
b8b0: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
b8c0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
b8d0: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
b8e0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
b8f0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
b900: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b910: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b920: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
b930: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
b940: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
b950: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b960: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b970: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
b980: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
b990: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b9a0: 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  N(db, p->nId*siz
b9b0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
b9c0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
b9d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
b9e0: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
b9f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ba00: 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61   }.  /* Note tha
ba10: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69  t because the si
ba20: 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
ba30: 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20  tion for p->a[] 
ba40: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65  is not.  ** nece
ba50: 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20  ssarily a power 
ba60: 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49  of two, sqlite3I
ba70: 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61  dListAppend() ma
ba80: 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a  y not be called.
ba90: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c    ** on the dupl
baa0: 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79  icate created by
bab0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
bac0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
bad0: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
bae0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
baf0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
bb00: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
bb10: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
bb20: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
bb30: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
bb40: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
bb50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
bb60: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
bb70: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
bb80: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
bb90: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
bba0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
bbb0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
bbc0: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
bbd0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
bbe0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
bbf0: 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72  lect *pNew, *pPr
bc00: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ior;.  assert( d
bc10: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
bc20: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bc30: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
bc40: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bc50: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
bc60: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
bc70: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
bc80: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
bc90: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
bca0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
bcb0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  s);.  pNew->pSrc
bcc0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
bcd0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
bce0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
bcf0: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
bd00: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
bd10: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
bd20: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
bd30: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
bd40: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
bd50: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
bd60: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
bd70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bd80: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
bd90: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
bda0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
bdb0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
bdc0: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
bdd0: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
bde0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
bdf0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
be00: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
be10: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
be20: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
be30: 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
be40: 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
be50: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  w;.  pNew->pNext
be60: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
be70: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
be80: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
be90: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  mit, flags);.  p
bea0: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
beb0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bec0: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c  , p->pOffset, fl
bed0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  ags);.  pNew->iL
bee0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
bef0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
bf00: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
bf10: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
bf20: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
bf30: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  l;.  pNew->addrO
bf40: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
bf50: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
bf60: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
bf70: 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f   pNew->nSelectRo
bf80: 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w = p->nSelectRo
bf90: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  w;.  pNew->pWith
bfa0: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
bfb0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69  ->pWith);.  sqli
bfc0: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
bfd0: 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61  (pNew, p->zSelNa
bfe0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  me);.  return pN
bff0: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
c000: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
c010: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
c020: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
c030: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
c040: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
c050: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
c060: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
c070: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
c080: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
c090: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
c0a0: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
c0b0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
c0c0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
c0d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
c0e0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
c0f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
c100: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
c110: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
c120: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
c130: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
c140: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
c150: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
c160: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
c170: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
c180: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
c190: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
c1a0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
c1b0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
c1c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c1d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
c1e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c1f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
c200: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
c210: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
c220: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
c230: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
c240: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
c250: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
c260: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
c270: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c280: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
c290: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c2a0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
c2b0: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
c2c0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
c2d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c2e0: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
c2f0: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
c300: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c310: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c320: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c330: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b  List->nExpr = 0;
c340: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
c350: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c360: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
c370: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
c380: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
c390: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
c3a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
c3b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
c3c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
c3d0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
c3e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c3f0: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
c400: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
c410: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
c420: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
c430: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
c440: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
c450: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
c460: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
c470: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
c480: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
c490: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
c4a0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
c4b0: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
c4c0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
c4d0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
c4e0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c4f0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
c500: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
c510: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
c520: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
c530: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
c540: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
c550: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
c560: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
c570: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
c580: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
c590: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
c5a0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
c5b0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
c5c0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
c5d0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
c5e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
c5f0: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
c600: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
c610: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
c620: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
c630: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
c640: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
c650: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
c660: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
c670: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
c680: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
c690: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
c6a0: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
c6b0: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
c6c0: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
c6d0: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
c6e0: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
c6f0: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
c700: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c710: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
c720: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
c730: 72 79 20 6f 6e 20 74 68 65 20 4c 48 53 2c 20 61  ry on the LHS, a
c740: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
c750: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
c760: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
c770: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
c780: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
c790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c7a0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
c7b0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c7c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c7d0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
c7e0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
c7f0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
c800: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
c810: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
c820: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
c830: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
c840: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
c850: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
c860: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
c870: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
c880: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
c890: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
c8a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c8b0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
c8c0: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
c8d0: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
c8e0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
c8f0: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
c900: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
c910: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
c920: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
c930: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
c940: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
c950: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
c960: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
c970: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
c980: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
c990: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c9a0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
c9b0: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
c9c0: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  pend_error;..  /
c9d0: 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20  * If the RHS is 
c9e0: 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77  a vector, then w
c9f0: 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c  e can immediatel
ca00: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  y check to see t
ca10: 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69  hat .  ** the si
ca20: 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e  ze of the RHS an
ca30: 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75  d LHS match.  Bu
ca40: 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  t if the RHS is 
ca50: 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20  a SELECT, .  ** 
ca60: 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20  wildcards ("*") 
ca70: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
ca80: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
ca90: 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
caa0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20   before.  ** we 
cab0: 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20  can do the size 
cac0: 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20  check, so defer 
cad0: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75  the size check u
cae0: 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
caf0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
cb00: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
cb10: 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e  ELECT && pColumn
cb20: 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74  s->nId!=(n=sqlit
cb30: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
cb40: 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20  (pExpr)) ){.    
cb50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
cb60: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
cb70: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
cb80: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
cba0: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
cbb0: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
cbc0: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
cbd0: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
cbe0: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69  pColumns->nId; i
cbf0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cc00: 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65  SubExpr = sqlite
cc10: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
cc20: 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  eld(pParse, pExp
cc30: 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, i);.    pList
cc40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
cc50: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
cc60: 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72   pList, pSubExpr
cc70: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
cc80: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cc90: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
cca0: 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20  iFirst+i+1 );.  
ccb0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
ccc0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  st->nExpr-1].zNa
ccd0: 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61  me = pColumns->a
cce0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
ccf0: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
cd00: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  zName = 0;.    }
cd10: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
cd20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
cd30: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   ){.    if( pLis
cd40: 74 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 46  t && pList->a[iF
cd50: 69 72 73 74 5d 2e 70 45 78 70 72 20 29 7b 0a 20  irst].pExpr ){. 
cd60: 20 20 20 20 20 45 78 70 72 20 2a 70 46 69 72 73       Expr *pFirs
cd70: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69  t = pList->a[iFi
cd80: 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  rst].pExpr;.    
cd90: 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74    assert( pFirst
cda0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
cdb0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a  COLUMN );.     .
cdc0: 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
cdd0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
cde0: 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f  ent in pRight so
cdf0: 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65   it will be dele
ce00: 74 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  ted when.      *
ce10: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  * sqlite3ExprLis
ce20: 74 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c  tDelete() is cal
ce30: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  led */.      pFi
ce40: 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 45  rst->pRight = pE
ce50: 78 70 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72  xpr;.      pExpr
ce60: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
ce70: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a  Remember the siz
ce80: 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
ce90: 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77  iTable so that w
cea0: 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74  e can check that
ceb0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48  .      ** the RH
cec0: 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20  S and LHS sizes 
ced0: 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64  match during cod
cee0: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f  e generation. */
cef0: 0a 20 20 20 20 20 20 70 46 69 72 73 74 2d 3e 69  .      pFirst->i
cf00: 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73  Table = pColumns
cf10: 2d 3e 6e 49 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->nId;.    }.  }
cf20: 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  ..vector_append_
cf30: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
cf40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
cf50: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
cf60: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
cf70: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65   pColumns);.  re
cf80: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
cf90: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
cfa0: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
cfb0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
cfc0: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
cfd0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
cfe0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
cff0: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
d000: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
d010: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
d020: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
d030: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
d040: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
d050: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
d060: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
d070: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
d080: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
d090: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
d0a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d0b0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
d0c0: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
d0d0: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
d0e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
d0f0: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
d100: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
d110: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
d120: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
d130: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
d140: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
d150: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
d160: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
d170: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d180: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
d190: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
d1a0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
d1b0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
d1c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
d1d0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
d1e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
d1f0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
d200: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
d210: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
d220: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
d230: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
d240: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
d250: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
d260: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d270: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d280: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
d290: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
d2a0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
d2b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
d2c0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
d2d0: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
d2e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
d2f0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
d300: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
d310: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
d320: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
d330: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
d340: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
d350: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
d360: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
d370: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
d380: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d390: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
d3a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
d3b0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
d3c0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d3d0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
d3e0: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
d3f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
d400: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
d410: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
d420: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
d430: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
d440: 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71  if( dequote ) sq
d450: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
d460: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
d470: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d480: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
d490: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
d4a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
d4b0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
d4c0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
d4d0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
d4e0: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
d4f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
d500: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
d510: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
d520: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
d530: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
d540: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
d550: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
d560: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
d570: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
d580: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d590: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
d5a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d5b0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d5c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
d5d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
d5e0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
d5f0: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
d600: 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70  pan. */.  ExprSp
d610: 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20  an *pSpan       
d620: 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f    /* The span to
d630: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a   be added */.){.
d640: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d650: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
d660: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
d670: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
d680: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
d690: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
d6a0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
d6b0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
d6c0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d6d0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
d6e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
d6f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
d700: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d710: 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d  || pItem->pExpr=
d720: 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b  =pSpan->pExpr );
d730: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
d740: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
d750: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
d760: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
d770: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
d780: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
d790: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53          (int)(pS
d7c0: 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61  pan->zEnd - pSpa
d7d0: 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d  n->zStart));.  }
d7e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
d7f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d800: 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73   pEList contains
d810: 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69   more than iLimi
d820: 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c  t elements,.** l
d830: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
d840: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
d850: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d860: 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
d870: 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gth(.  Parse *pP
d880: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
d890: 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73   *pEList,.  cons
d8a0: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a  t char *zObject.
d8b0: 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50  ){.  int mx = pP
d8c0: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
d8d0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
d8e0: 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73  LUMN];.  testcas
d8f0: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
d900: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29  ist->nExpr==mx )
d910: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
d920: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
d930: 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20  nExpr==mx+1 );. 
d940: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
d950: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20  EList->nExpr>mx 
d960: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d970: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d980: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
d990: 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74   in %s", zObject
d9a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d9b0: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
d9c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d9d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
d9e0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
d9f0: 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e   exprListDeleteN
da00: 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  N(sqlite3 *db, E
da10: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
da20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
da30: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
da40: 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
da50: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
da60: 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  | pList->nExpr==
da70: 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  0 );.  for(pItem
da80: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
da90: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
daa0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
dab0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
dac0: 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
dad0: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
dae0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
daf0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
db00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
db10: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
db20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
db30: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
db40: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
db50: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
db60: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
db70: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71  xprListDelete(sq
db80: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
db90: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
dba0: 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c  f( pList ) exprL
dbb0: 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  istDeleteNN(db, 
dbc0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
dbd0: 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 77   Return the bitw
dbe0: 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78  ise-OR of all Ex
dbf0: 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20  pr.flags fields 
dc00: 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  in the given.** 
dc10: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32  ExprList..*/.u32
dc20: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dc30: 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72  Flags(const Expr
dc40: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
dc50: 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d  int i;.  u32 m =
dc60: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
dc70: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
dc80: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
dc90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78 70  i++){.       Exp
dca0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
dcb0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
dcc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
dcd0: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
dce0: 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67  m |= pExpr->flag
dcf0: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  s;.    }.  }.  r
dd00: 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn m;.}../*.*
dd10: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
dd20: 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c   are Walker call
dd30: 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68  backs used to ch
dd40: 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20  eck expressions 
dd50: 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65  to.** see if the
dd60: 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22  y are "constant"
dd70: 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69   for some defini
dd80: 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74  tion of constant
dd90: 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72  .  The.** Walker
dda0: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74  .eCode value det
ddb0: 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65  ermines the type
ddc0: 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77   of "constant" w
ddd0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  e are looking.**
dde0: 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73   for..**.** Thes
ddf0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
de00: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
de10: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f  implement the fo
de20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
de30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
de40: 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20  Constant()      
de50: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
de60: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a  ker->eCode==1.**
de70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
de80: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
de90: 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70 57  n()           pW
dea0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a  alker->eCode==2.
deb0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
dec0: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
ded0: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
dee0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
def0: 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  3.**     sqlite3
df00: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
df10: 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20  Function()      
df20: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
df30: 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49  ==4 or 5.**.** I
df40: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65  n all cases, the
df50: 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57   callbacks set W
df60: 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e  alker.eCode=0 an
df70: 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20 65  d abort if the e
df80: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
df90: 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20  found to not be 
dfa0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a  a constant..**.*
dfb0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70  * The sqlite3Exp
dfc0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
dfd0: 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20  ction() is used 
dfe0: 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65  for evaluating e
dff0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e  xpressions.** in
e000: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
e010: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
e020: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c  Walker.eCode val
e030: 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61 72  ue is 5 when par
e040: 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74  sing.** an exist
e050: 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34  ing schema and 4
e060: 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   when processing
e070: 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74   a new statement
e080: 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  .  A bound.** pa
e090: 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20 61  rameter raises a
e0a0: 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20  n error for new 
e0b0: 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20  statements, but 
e0c0: 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76  is silently conv
e0d0: 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  erted.** to NULL
e0e0: 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63   for existing sc
e0f0: 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c  hemas.  This all
e100: 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ows sqlite_maste
e110: 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a  r tables that .*
e120: 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e  * contain a boun
e130: 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63 61  d parameter beca
e140: 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67 65  use they were ge
e150: 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72  nerated by older
e160: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
e170: 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72  SQLite to be par
e180: 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  sed by newer ver
e190: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
e1a0: 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20  without raising 
e1b0: 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73  a.** malformed s
e1c0: 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a  chema error..*/.
e1d0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
e1e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
e1f0: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
e200: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20  xpr *pExpr){..  
e210: 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65  /* If pWalker->e
e220: 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20 61  Code is 2 then a
e230: 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65  ny term of the e
e240: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
e250: 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  omes from.  ** t
e260: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
e270: 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74  lauses of a left
e280: 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69   join disqualifi
e290: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
e2a0: 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e  n.  ** from bein
e2b0: 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e  g considered con
e2c0: 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  stant. */.  if( 
e2d0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
e2e0: 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  2 && ExprHasProp
e2f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
e300: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
e310: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
e320: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
e330: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
e340: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
e350: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e  op ){.    /* Con
e360: 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  sider functions 
e370: 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69  to be constant i
e380: 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75  f all their argu
e390: 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61  ments are consta
e3a0: 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69  nt.    ** and ei
e3b0: 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43  ther pWalker->eC
e3c0: 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74  ode==4 or 5 or t
e3d0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  he function has 
e3e0: 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  the.    ** SQLIT
e3f0: 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61  E_FUNC_CONST fla
e400: 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  g. */.    case T
e410: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
e420: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
e430: 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48  Code>=4 || ExprH
e440: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
e450: 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29  ,EP_ConstFunc) )
e460: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
e470: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
e480: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e490: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
e4a0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
e4b0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
e4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61  ;.      }.    ca
e4d0: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
e4e0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
e4f0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
e500: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
e510: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
e520: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e530: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
e540: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e550: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e560: 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
e570: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e580: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
e590: 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
e5a0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e5b0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
e5c0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MN );.      if( 
e5d0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
e5e0: 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  3 && pExpr->iTab
e5f0: 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  le==pWalker->u.i
e600: 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cur ){.        r
e610: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
e620: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
e630: 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
e640: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
e650: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
e660: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
e670: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
e680: 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70  BLE:.      if( p
e690: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35  Walker->eCode==5
e6a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
e6b0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20  ilently convert 
e6c0: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73  bound parameters
e6d0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73   that appear ins
e6e0: 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20  ide of CREATE.  
e6f0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
e700: 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20  nts into a NULL 
e710: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65  when parsing the
e720: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
e730: 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20  t text out.     
e740: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c     ** of the sql
e750: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e760: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
e770: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
e780: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e790: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e7a0: 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =4 ){.        /*
e7b0: 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   A bound paramet
e7c0: 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73  er in a CREATE s
e7d0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72  tatement that or
e7e0: 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20  iginates from.  
e7f0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
e800: 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65  _prepare() cause
e810: 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
e820: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e830: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e840: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e850: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e860: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
e870: 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74  h */.    default
e880: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
e890: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e8a0: 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c  SELECT ); /* sel
e8b0: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e8c0: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
e8d0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
e8e0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
e8f0: 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65  _EXISTS ); /* se
e900: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e910: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
e920: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
e930: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
e940: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
e950: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
e960: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
e970: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  lker, Select *No
e980: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
e990: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
e9a0: 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ed);.  pWalker->
e9b0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74  eCode = 0;.  ret
e9c0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
e9d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
e9e0: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
e9f0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69   int initFlag, i
ea00: 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b  nt iCur){.  Walk
ea10: 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
ea20: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
ea30: 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e  ;.  w.eCode = in
ea40: 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70  itFlag;.  w.xExp
ea50: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
ea60: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
ea70: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
ea80: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
ea90: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
eaa0: 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  u.iCur = iCur;. 
eab0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
eac0: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
ead0: 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
eae0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
eaf0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
eb00: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
eb10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
eb20: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
eb30: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
eb40: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
eb50: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
eb60: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
eb70: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
eb80: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
eb90: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
eba0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
ebb0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
ebc0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
ebd0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
ebe0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
ebf0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
ec00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ec10: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
ec20: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
ec30: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
ec40: 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   1, 0);.}../*.**
ec50: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
ec60: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
ec70: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
ec80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ec90: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74  constant.** that
eca0: 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61   does no origina
ecb0: 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  te from the ON o
ecc0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ecd0: 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65  of a join..** Re
ece0: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76  turn 0 if it inv
ecf0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
ed00: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
ed10: 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a  s or terms from.
ed20: 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e  ** an ON or USIN
ed30: 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  G clause..*/.int
ed40: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
ed50: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
ed60: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
ed70: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
ed80: 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2, 0);.}../*.** 
ed90: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
eda0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
edb0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
edc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
edd0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61  onstant.** for a
ede0: 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66  ny single row of
edf0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
ee00: 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e  cursor iCur.  In
ee10: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
ee20: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
ee30: 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74  must not refer t
ee40: 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d  o any non-determ
ee50: 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
ee60: 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c   nor any.** tabl
ee70: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75  e other than iCu
ee80: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
ee90: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
eea0: 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  tant(Expr *p, in
eeb0: 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72  t iCur){.  retur
eec0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
eed0: 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a   3, iCur);.}../*
eee0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
eef0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
ef00: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
ef10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ef20: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
ef30: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
ef40: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
ef50: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
ef60: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
ef70: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
ef80: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
ef90: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
efa0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
efb0: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
efc0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
efd0: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
efe0: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
eff0: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
f000: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
f010: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
f020: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
f030: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f040: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
f050: 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e  Expr *p, u8 isIn
f060: 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  it){.  assert( i
f070: 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e  sInit==0 || isIn
f080: 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  it==1 );.  retur
f090: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
f0a0: 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d   4+isInit, 0);.}
f0b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f0c0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
f0d0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  NTS./*.** Walk a
f0e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
f0f0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
f100: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
f110: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62  ontains a.** sub
f120: 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69  query of some ki
f130: 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  nd.  Return 0 if
f140: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75   there are no su
f150: 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74  bqueries..*/.int
f160: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74   sqlite3ExprCont
f170: 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78 70  ainsSubquery(Exp
f180: 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  r *p){.  Walker 
f190: 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
f1a0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
f1b0: 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20   w.eCode = 1;.  
f1c0: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
f1d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
f1e0: 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
f1f0: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
f200: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
f210: 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  t;.  sqlite3Walk
f220: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
f230: 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30  eturn w.eCode==0
f240: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
f250: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
f260: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
f270: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
f280: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
f290: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
f2a0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
f2b0: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
f2c0: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
f2d0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
f2e0: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
f2f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
f300: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
f310: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
f320: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
f330: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
f340: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
f350: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
f360: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
f370: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f380: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
f390: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
f3a0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
f3b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  ;..  /* If an ex
f3c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
f3d0: 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
f3e0: 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
f3f0: 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
f400: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
f410: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
f420: 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
f430: 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
f440: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
f450: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
f460: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
f470: 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
f480: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
f490: 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
f4a0: 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
f4b0: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
f4c0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
f4d0: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
f4e0: 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
f4f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f500: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
f510: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
f520: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
f530: 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
f540: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
f550: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
f560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f570: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
f580: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
f590: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
f5a0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
f5b0: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
f5c0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f5d0: 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
f5e0: 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
f5f0: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
f600: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
f610: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
f630: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
f640: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f650: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
f660: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
f670: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
f680: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
f690: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
f6a0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
f6b0: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
f6c0: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
f6d0: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
f6e0: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
f6f0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
f700: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f710: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
f720: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
f730: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
f740: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
f750: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
f760: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
f770: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
f780: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
f790: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
f7a0: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
f7b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
f7c0: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
f7d0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
f7e0: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
f7f0: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
f800: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
f810: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
f820: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
f830: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
f840: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
f850: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
f860: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
f870: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
f880: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
f890: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
f8a0: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
f8b0: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
f8c0: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
f8d0: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
f8e0: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
f8f0: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
f900: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
f910: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
f920: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
f930: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
f940: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
f950: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
f960: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
f970: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
f980: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
f990: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
f9a0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
f9b0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
f9c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f9d0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
f9e0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
f9f0: 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  p->pTab!=0 );.  
fa00: 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
fa10: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
fa20: 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
fa40: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
fa50: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69  >pTab->aCol[p->i
fa60: 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
fa70: 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  =0);.    default
fa80: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
fa90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
faa0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
fab0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
fac0: 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
fad0: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a   which would be.
fae0: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20  ** unchanged by 
faf0: 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68  OP_Affinity with
fb00: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69   the affinity gi
fb10: 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
fb20: 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
fb30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fb40: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
fb50: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50  ermine if the OP
fb60: 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74  _Affinity operat
fb70: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d  ion.** can be om
fb80: 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20  itted.  When in 
fb90: 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c  doubt return FAL
fba0: 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  SE.  A false neg
fbb0: 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d  ative.** is harm
fbc0: 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70  less.  A false p
fbd0: 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72  ositive, however
fbe0: 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  , can result in 
fbf0: 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73  the wrong.** ans
fc00: 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wer..*/.int sqli
fc10: 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
fc20: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e  finityChange(con
fc30: 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72  st Expr *p, char
fc40: 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a   aff){.  u8 op;.
fc50: 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54    if( aff==SQLIT
fc60: 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74  E_AFF_BLOB ) ret
fc70: 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  urn 1;.  while( 
fc80: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
fc90: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
fca0: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
fcb0: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
fcc0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
fcd0: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
fce0: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
fcf0: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
fd00: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
fd10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
fd20: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
fd30: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
fd40: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
fd50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
fd60: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
fd70: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
fd80: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c  QLITE_AFF_REAL |
fd90: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
fda0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
fdb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
fdc0: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ING: {.      ret
fdd0: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
fde0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  AFF_TEXT;.    }.
fdf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
fe00: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
fe10: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
fe20: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
fe30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
fe40: 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f  >iTable>=0 );  /
fe50: 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61  * p cannot be pa
fe60: 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f  rt of a CHECK co
fe70: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
fe80: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c    return p->iCol
fe90: 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20  umn<0.          
fea0: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
feb0: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
fec0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
fed0: 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20  UMERIC);.    }. 
fee0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
fef0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ff00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ff10: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
ff20: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
ff30: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
ff40: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
ff50: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
ff60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
ff70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
ff80: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
ff90: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
ffa0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
ffb0: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
ffc0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
ffd0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
ffe0: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
fff0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
10000 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
10010 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52  *.** pX is the R
10020 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72  HS of an IN oper
10030 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20  ator.  If pX is 
10040 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
10050 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  nt .** that can 
10060 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f  be simplified to
10070 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
10080 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74  access, then ret
10090 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
100a0 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73   to the SELECT s
100b0 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58  tatement.  If pX
100c0 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54   is not a SELECT
100d0 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f   statement,.** o
100e0 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  r if the SELECT 
100f0 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20  statement needs 
10100 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64  to be manifested
10110 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e   into a transien
10120 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e  t.** table, then
10130 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
10140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10150 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74  OMIT_SUBQUERY.st
10160 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43  atic Select *isC
10170 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
10180 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65  (Expr *pX){.  Se
10190 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69  lect *p;.  SrcLi
101a0 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72  st *pSrc;.  Expr
101b0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
101c0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
101d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70  nt i;.  if( !Exp
101e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
101f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
10200 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e   return 0;  /* N
10210 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  ot a subquery */
10220 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
10230 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61  operty(pX, EP_Va
10240 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74 75  rSelect)  ) retu
10250 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c  rn 0;  /* Correl
10260 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70  ated subq */.  p
10270 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   = pX->x.pSelect
10280 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
10290 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
102a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
102b0 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
102c0 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
102d0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
102e0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
102f0 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
10300 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
10310 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
10320 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
10330 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
10340 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10350 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
10360 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
10370 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
10380 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
10390 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
103a0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
103b0 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
103c0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
103d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
103e0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
103f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
10400 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
10410 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
10420 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
10430 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
10440 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
10450 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
10460 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
10470 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
10480 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
10490 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
104a0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
104b0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
104d0 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
104e0 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
104f0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
10500 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
10510 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
10520 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
10530 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
10540 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
10550 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
10560 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
10570 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10580 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
10590 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
105a0 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
105b0 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
105c0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
105d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
105e0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
105f0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
10600 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
10610 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  not a view */.  
10620 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
10630 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ab) ) return 0; 
10640 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
10650 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74  lause not a virt
10660 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ual table */.  p
10670 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
10680 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  t;.  assert( pEL
10690 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41  ist!=0 );.  /* A
106a0 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  ll SELECT result
106b0 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e  s must be column
106c0 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  s. */.  for(i=0;
106d0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
106e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
106f0 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d   *pRes = pEList-
10700 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
10710 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54   if( pRes->op!=T
10720 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
10730 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n 0;.    assert(
10740 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70   pRes->iTable==p
10750 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  Src->a[0].iCurso
10760 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63  r );  /* Not a c
10770 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
10780 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ry */.  }.  retu
10790 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn p;.}.#endif /
107a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
107b0 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
107c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
107d0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
107e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
107f0 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74   checks the left
10800 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
10810 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72  index table iCur
10820 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74   to see if.** it
10830 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
10840 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75  LL entries.  Cau
10850 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  se the register 
10860 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f  at regHasNull to
10870 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20   be set.** to a 
10880 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
10890 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
108a0 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65  no NULLs.  Cause
108b0 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73   register regHas
108c0 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65  Null.** to be se
108d0 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75  t to NULL if iCu
108e0 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  r contains one o
108f0 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
10900 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
10910 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73  id sqlite3SetHas
10920 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76  NullFlag(Vdbe *v
10930 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20  , int iCur, int 
10940 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69  regHasNull){.  i
10950 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69  nt addr1;.  sqli
10960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10970 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
10980 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61  regHasNull);.  a
10990 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
109a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
109b0 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64  ewind, iCur); Vd
109c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
109d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
109e0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
109f0 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73   iCur, 0, regHas
10a00 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  Null);.  sqlite3
10a10 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
10a20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
10a30 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
10a40 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72  ((v, "first_entr
10a50 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29  y_in(%d)", iCur)
10a60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10a70 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10a80 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  1);.}.#endif...#
10a90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10aa0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
10ab0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
10ac0 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
10ad0 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f   with a list (no
10ae0 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e  t a subquery) on
10af0 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   the .** right-h
10b00 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72  and side.  Retur
10b10 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c  n TRUE if that l
10b20 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  ist is constant.
10b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
10b40 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
10b50 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29  stant(Expr *pIn)
10b60 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a  {.  Expr *pLHS;.
10b70 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
10b80 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
10b90 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49  perty(pIn, EP_xI
10ba0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c  sSelect) );.  pL
10bb0 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b  HS = pIn->pLeft;
10bc0 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
10bd0 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  0;.  res = sqlit
10be0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10bf0 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c  (pIn);.  pIn->pL
10c00 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65  eft = pLHS;.  re
10c10 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64  turn res;.}.#end
10c20 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
10c30 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
10c40 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
10c50 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
10c60 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
10c70 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65  ** The pX parame
10c80 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65  ter is the expre
10c90 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53  ssion on the RHS
10ca0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
10cb0 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69  tor, which.** mi
10cc0 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20  ght be either a 
10cd0 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
10ce0 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72  ons or a subquer
10cf0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  y..**.** The job
10d00 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
10d10 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
10d20 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f  reate a b-tree o
10d30 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a  bject that can.*
10d40 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72  * be used either
10d50 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d   to test for mem
10d60 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52  bership in the R
10d70 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  HS set or to ite
10d80 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
10d90 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74  all members of t
10da0 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70  he RHS set, skip
10db0 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
10dc0 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  .**.** A cursor 
10dd0 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
10de0 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
10df0 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f  hat is the RHS o
10e00 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
10e10 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
10e20 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
10e30 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
10e40 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
10e50 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
10e60 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
10e70 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
10e80 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
10e90 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
10ea0 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
10eb0 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
10ec0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
10ed0 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
10ee0 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
10ef0 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65  INDEX_ASC  - The
10f00 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
10f10 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  ed on an ascendi
10f20 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  ng index..**   I
10f30 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
10f40 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  SC - The cursor 
10f50 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
10f60 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
10f70 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
10f80 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65  EPH        - The
10f90 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
10fa0 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
10fb0 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
10fe0 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
10ff0 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
11000 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e  X_NOOP       - N
11010 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c  o cursor was all
11020 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20  ocated.  The IN 
11030 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
11040 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11050 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c              impl
11060 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71  emented as a seq
11070 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
11080 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  sons..**.** An e
11090 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
110a0 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
110b0 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
110c0 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
110d0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
110e0 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
110f0 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31   SELECT <column1
11100 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20  >, <column2>... 
11110 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
11120 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  ** If the RHS of
11130 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
11140 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20   is a list or a 
11150 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62  more complex sub
11160 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61  query, then.** a
11170 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
11180 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
11190 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  be generated fro
111a0 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  m the RHS and th
111b0 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65  en.** pX->iTable
111c0 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
111d0 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  o the ephemeral 
111e0 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
111f0 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
11200 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
11210 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74   inFlags paramet
11220 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  er must contain 
11230 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  exactly one of t
11240 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
11250 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
11260 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e  r IN_INDEX_LOOP.
11270 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e    If inFlags con
11280 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45  tains.** IN_INDE
11290 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68  X_MEMBERSHIP, th
112a0 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  en the generated
112b0 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75   table will be u
112c0 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73  sed for a.** fas
112d0 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
112e0 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f  t.  When the IN_
112f0 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69  INDEX_LOOP bit i
11300 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e  s set, the.** IN
11310 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75   index will be u
11320 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72  sed to loop over
11330 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74   all values of t
11340 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a  he RHS of the.**
11350 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a   IN operator..**
11360 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
11370 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28  X_LOOP is used (
11380 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
11390 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
113a0 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
113b0 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
113c0 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  s) then the b-tr
113d0 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  ee must not cont
113e0 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ain duplicates..
113f0 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20  ** An epheremal 
11400 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73  table must be us
11410 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65  ed unless the se
11420 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61  lected columns a
11430 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  re guaranteed.**
11440 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20   to be unique - 
11450 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69  either because i
11460 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  t is an INTEGER 
11470 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64  PRIMARY KEY or d
11480 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55  ue to.** a UNIQU
11490 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  E constraint or 
114a0 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  index..**.** Whe
114b0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  n IN_INDEX_MEMBE
114c0 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28 61  RSHIP is used (a
114d0 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  nd the b-tree wi
114e0 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ll be used .** f
114f0 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62  or fast set memb
11500 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74 68  ership tests) th
11510 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  en an epheremal 
11520 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62  table must .** b
11530 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63  e used unless <c
11540 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e  olumns> is a sin
11550 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  gle INTEGER PRIM
11560 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
11570 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63  r an .** index c
11580 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68  an be found with
11590 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 3c   the specified <
115a0 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20  columns> as its 
115b0 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a  left-most..**.**
115c0 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58   If the IN_INDEX
115d0 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f  _NOOP_OK and IN_
115e0 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
115f0 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e   are both set an
11600 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20  d.** if the RHS 
11610 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
11620 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f  or is a list (no
11630 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68  t a subquery) th
11640 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
11650 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20  ne might decide 
11660 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e  that creating an
11670 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65   ephemeral b-tre
11680 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  e for membership
11690 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74  .** testing is t
116a0 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64  oo expensive and
116b0 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
116c0 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20  _NOOP.  In that 
116d0 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c  case, the.** cal
116e0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f  ling routine sho
116f0 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  uld implement th
11700 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73  e IN operator us
11710 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a  ing a sequence.*
11720 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f  * of Eq or Ne co
11730 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
11740 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ons..**.** When 
11750 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65  the b-tree is be
11760 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ing used for mem
11770 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74  bership tests, t
11780 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
11790 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65  ion.** might nee
117a0 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65  d to know whethe
117b0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53  r or not the RHS
117c0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
117d0 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74  operator.** cont
117e0 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66  ains a NULL.  If
117f0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73   prRhsHasNull is
11800 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   not a NULL poin
11810 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74  ter and .** if t
11820 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e  here is any chan
11830 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
11840 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  ) might contain 
11850 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a  a NULL value at.
11860 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e  ** runtime, then
11870 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
11880 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
11890 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
118a0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a   written.** to *
118b0 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66  prRhsHasNull. If
118c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
118d0 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
118e0 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  .) contains a.**
118f0 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
11900 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  n *prRhsHasNull 
11910 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
11920 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  d..**.** If a re
11930 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
11940 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61  ted and its loca
11950 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a  tion stored in *
11960 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68  prRhsHasNull, th
11970 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  en.** the value 
11980 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  in that register
11990 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
119a0 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
119b0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
119c0 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  .** NULL values,
119d0 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20   and it will be 
119e0 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  some non-NULL va
119f0 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65  lue if the b-tre
11a00 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a  e contains no.**
11a10 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
11a20 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70  .** If the aiMap
11a30 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
11a40 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20  t NULL, it must 
11a50 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61  point to an arra
11a60 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  y containing.** 
11a70 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20  one element for 
11a80 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  each column retu
11a90 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
11aa0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
11ab0 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68  the RHS.** of th
11ac0 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  e IN(...) operat
11ad0 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74  or. The i'th ent
11ae0 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ry of the array 
11af0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11b00 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20  h the.** offset 
11b10 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
11b20 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  umn that matches
11b30 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
11b40 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11b50 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20  .** SELECT. For 
11b60 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
11b70 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
11b80 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61 72  elected index ar
11b90 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c  e:.**.**   (?,?,
11ba0 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c  ?) IN (SELECT a,
11bb0 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a   b, c FROM t1).*
11bc0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
11bd0 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20   i1 ON t1(b, c, 
11be0 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61  a);.**.** then a
11bf0 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61  iMap[] is popula
11c00 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20  ted with {2, 0, 
11c10 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  1}..*/.#ifndef S
11c20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11c30 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
11c40 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61  indInIndex(.  Pa
11c50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11c60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
11c70 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11c80 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20   Expr *pX,      
11c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11ca0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
11cb0 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65 20  de (RHS) of the 
11cc0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
11cd0 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20   u32 inFlags,   
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11cf0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d  N_INDEX_LOOP, _M
11d00 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f  EMBERSHIP, and/o
11d10 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20  r _NOOP_OK */.  
11d20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
11d30 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  l,         /* Re
11d40 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e  gister holding N
11d50 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65  ULL status.  See
11d60 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   notes */.  int 
11d70 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20 20 20  *aiMap          
11d80 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
11d90 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65  g from Index fie
11da0 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64  lds to RHS field
11db0 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  s */.){.  Select
11dc0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11de0 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65  /* SELECT to the
11df0 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65   right of IN ope
11e00 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65  rator */.  int e
11e10 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Type = 0;       
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e30 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20   /* Type of RHS 
11e40 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f  table. IN_INDEX_
11e50 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  * */.  int iTab 
11e60 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
11e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11e80 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48  Cursor of the RH
11e90 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  S table */.  int
11ea0 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20   mustBeUnique;  
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ec0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48     /* True if RH
11ed0 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65  S must be unique
11ee0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
11ef0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
11f00 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56  Parse);     /* V
11f10 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
11f20 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20  eing coded */.. 
11f30 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
11f40 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74  =TK_IN );.  must
11f50 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c  BeUnique = (inFl
11f60 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
11f70 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49  OOP)!=0;..  /* I
11f80 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 69  f the RHS of thi
11f90 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  s IN(...) operat
11fa0 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20  or is a SELECT, 
11fb0 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65 72  and if it matter
11fc0 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  s .  ** whether 
11fd0 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43  or not the SELEC
11fe0 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e  T result contain
11ff0 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63  s NULL values, c
12000 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a  heck whether.  *
12010 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73  * or not NULL is
12020 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62   actually possib
12030 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62  le (it may not b
12040 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  e, for example, 
12050 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54  due .  ** to NOT
12060 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
12070 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29  s in the schema)
12080 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  . If no NULL val
12090 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ues are possible
120a0 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73  ,.  ** set prRhs
120b0 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66  HasNull to 0 bef
120c0 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  ore continuing. 
120d0 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48   */.  if( prRhsH
120e0 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66  asNull && (pX->f
120f0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
12100 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ect) ){.    int 
12110 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  i;.    ExprList 
12120 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e  *pEList = pX->x.
12130 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
12140 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12150 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
12160 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
12170 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
12180 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ull(pEList->a[i]
12190 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b  .pExpr) ) break;
121a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
121b0 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ==pEList->nExpr 
121c0 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48 61  ){.      prRhsHa
121d0 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  sNull = 0;.    }
121e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
121f0 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78   to see if an ex
12200 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
12210 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
12220 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66  d to.  ** satisf
12230 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  y the query.  Th
12240 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65  is is preferable
12250 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61   to generating a
12260 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d   new .  ** ephem
12270 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  eral table.  */.
12280 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
12290 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73  rr==0 && (p = is
122a0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
122b0 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20  t(pX))!=0 ){.   
122c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
122d0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
122e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
122f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12300 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
12310 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12330 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
12340 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20  /.    i16 iDb;  
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12370 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72  Database idx for
12380 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70   pTab */.    Exp
12390 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
123a0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  p->pEList;.    i
123b0 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73  nt nExpr = pELis
123c0 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61  t->nExpr;..    a
123d0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
123e0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
123f0 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
12400 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
12410 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
12420 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
12430 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
12440 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66  ); /* Because of
12450 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
12460 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
12470 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
12480 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
12490 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
124a0 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
124b0 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70  nOpt(p) */.    p
124c0 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
124d0 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f  [0].pTab;..    /
124e0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61  * Code an OP_Tra
124f0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f  nsaction and OP_
12500 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
12510 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
12520 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12530 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
12540 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
12550 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
12560 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
12570 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
12580 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
12590 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
125a0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
125b0 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  ame);..    asser
125c0 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65  t(v);  /* sqlite
125d0 33 47 65 74 56 64 62 65 28 29 20 68 61 73 20 61  3GetVdbe() has a
125e0 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65 76 69  lways been previ
125f0 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a  ously called */.
12600 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
12610 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
12620 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  .pExpr->iColumn<
12630 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
12640 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  e "x IN (SELECT 
12650 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65  rowid FROM table
12660 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  )" case */.     
12670 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
12680 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
12690 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20  , OP_Once);.    
126a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
126b0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
126c0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
126d0 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
126e0 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
126f0 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
12700 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
12710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12720 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
12730 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
12740 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
12750 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
12760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12770 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
12780 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
12790 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
127a0 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
127b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
127c0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
127d0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
127e0 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
127f0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
12800 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
12810 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
12820 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
12830 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  in table.      *
12840 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * on the RHS of 
12850 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
12860 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20    If it not, it 
12870 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
12880 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  to.      ** use 
12890 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65  any index of the
128a0 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a   RHS table.  */.
128b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
128c0 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
128d0 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
128e0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
128f0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
12900 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
12910 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
12920 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
12930 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12940 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
12950 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
12960 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
12970 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62  umnAffinity(pTab
12980 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74  ,iCol); /* RHS t
12990 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
129a0 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
129b0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
129c0 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
129d0 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  f);.        test
129e0 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
129f0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
12a00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12a10 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
12a20 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
12a30 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
12a40 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
12a50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
12a60 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
12a70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12a80 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
12a90 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
12aa0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
12ab0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
12ac0 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20  () only returns 
12ad0 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65  TEXT if one side
12ae0 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20   or the.        
12af0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73      ** other has
12b00 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64   no affinity and
12b10 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
12b20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c  is TEXT.  Hence,
12b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
12b40 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  the only way for
12b50 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45   cmpaff to be TE
12b60 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66  XT is for idxaff
12b70 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20   to be TEXT.    
12b80 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66          ** and f
12b90 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74  or the term on t
12ba0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
12bb0 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69   to have no affi
12bc0 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nity. */.       
12bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
12be0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
12bf0 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
12c00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12c10 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
12c20 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
12c30 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
12c40 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
12c50 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
12c60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
12c70 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f     if( affinity_
12c80 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ok ){.        /*
12c90 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
12ca0 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68  xisting index th
12cb0 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72  at will work for
12cc0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
12cd0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
12ce0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
12cf0 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
12d00 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d  e==0; pIdx=pIdx-
12d10 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
12d20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73     Bitmask colUs
12d30 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ed;      /* Colu
12d40 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
12d50 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
12d60 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b     Bitmask mCol;
12d70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
12d80 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
12d90 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20   column */.     
12da0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
12db0 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63  Column<nExpr ) c
12dc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12dd0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43     /* Maximum nC
12de0 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20  olumn is BMS-2, 
12df0 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68  not BMS-1, so th
12e00 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74  at we can comput
12e10 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42  e.          ** B
12e20 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69  ITMASK(nExpr) wi
12e30 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e  thout overflowin
12e40 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  g */.          t
12e50 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
12e60 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b  Column==BMS-2 );
12e70 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
12e80 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ase( pIdx->nColu
12e90 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  mn==BMS-1 );.   
12ea0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12eb0 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20  >nColumn>=BMS-1 
12ec0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12ed0 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42 65        if( mustBe
12ee0 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20  Unique ){.      
12ef0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12f00 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20  nKeyCol>nExpr.  
12f10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49             ||(pI
12f20 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70  dx->nColumn>nExp
12f30 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e  r && !IsUniqueIn
12f40 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20 20  dex(pIdx)).     
12f50 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
12f60 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
12f70 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78  ;  /* This index
12f80 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f   is not unique o
12f90 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20 63  ver the IN RHS c
12fa0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
12fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12fc0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
12fd0 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20   colUsed = 0;   
12fe0 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e  /* Columns of in
12ff0 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72 20  dex used so far 
13000 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
13010 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
13020 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13030 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
13040 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
13050 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66  Subexpr(pX->pLef
13060 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
13070 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20     Expr *pRhs = 
13080 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
13090 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
130a0 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20  CollSeq *pReq = 
130b0 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
130c0 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
130d0 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b  se, pLhs, pRhs);
130e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
130f0 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20   j;.  .         
13100 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71 21     assert( pReq!
13110 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c  =0 || pRhs->iCol
13120 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c  umn==XN_ROWID ||
13130 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b   pParse->nErr );
13140 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
13150 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a  (j=0; j<nExpr; j
13160 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13170 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
13180 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e  olumn[j]!=pRhs->
13190 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
131a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
131b0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
131c0 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20  azColl[j] );.   
131d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
131e0 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65  Req!=0 && sqlite
131f0 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a  3StrICmp(pReq->z
13200 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
13210 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20  ll[j])!=0 ){.   
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
13230 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
13240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13270 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78        if( j==nEx
13280 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
13290 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d          mCol = M
132a0 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20  ASKBIT(j);.     
132b0 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20         if( mCol 
132c0 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61  & colUsed ) brea
132d0 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d  k; /* Each colum
132e0 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  n used only once
132f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
13300 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b  colUsed |= mCol;
13310 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13320 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69   aiMap ) aiMap[i
13330 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  ] = j;.         
13340 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
13350 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72  assert( i==nExpr
13360 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41   || colUsed!=(MA
13370 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20  SKBIT(nExpr)-1) 
13380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13390 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42   colUsed==(MASKB
133a0 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a  IT(nExpr)-1) ){.
133b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
133c0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
133d0 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
133e0 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  s the index pIdx
133f0 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20   is usable */.  
13400 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
13410 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
13420 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
13430 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
13440 65 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  e(v);.#ifndef SQ
13450 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
13460 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  N.            sq
13470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13480 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30  v, OP_Explain, 0
13490 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
134a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
134b0 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20  intf(db, "USING 
134c0 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d  INDEX %s FOR IN-
134d0 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e  OPERATOR",pIdx->
134e0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
134f0 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43        P4_DYNAMIC
13500 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
13510 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13520 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
13530 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
13540 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
13550 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13560 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
13570 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
13580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
13590 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
135a0 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
135b0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
135c0 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
135d0 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
135e0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
135f0 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
13600 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
13610 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20  DEX_INDEX_ASC + 
13620 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
13630 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  [0];.  .        
13640 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73      if( prRhsHas
13650 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53  Null ){.#ifdef S
13660 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
13670 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
13680 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20              i64 
13690 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72  mask = (1<<nExpr
136a0 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )-1;.           
136b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
136c0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
136d0 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20  olumnsUsed, .   
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
136f0 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29  Tab, 0, 0, (u8*)
13700 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29  &mask, P4_INT64)
13710 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
13720 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73         *prRhsHas
13730 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
13740 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
13750 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d       if( nExpr==
13760 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
13770 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48       sqlite3SetH
13780 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54  asNullFlag(v, iT
13790 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  ab, *prRhsHasNul
137a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
137b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
137c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
137d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
137e0 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
137f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13800 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f   } /* End loop o
13810 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ver indexes */. 
13820 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66       } /* End if
13830 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20  ( affinity_ok ) 
13840 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  */.    } /* End 
13850 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20  if not an rowid 
13860 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20  index */.  } /* 
13870 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  End attempt to o
13880 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e  ptimize using an
13890 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20   index */..  /* 
138a0 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e  If no preexistin
138b0 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c  g index is avail
138c0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20  able for the IN 
138d0 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20  clause.  ** and 
138e0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
138f0 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c   an allowed repl
13900 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
13910 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
13920 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c  rator is a list,
13930 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a   not a subquery.
13940 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
13950 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
13960 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66   or has two or f
13970 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a  ewer terms,.  **
13980 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
13990 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61  worth creating a
139a0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
139b0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  e to evaluate.  
139c0 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ** the IN operat
139d0 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f  or so return IN_
139e0 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f  INDEX_NOOP..  */
139f0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a  .  if( eType==0.
13a00 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26     && (inFlags &
13a10 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
13a20 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  K).   && !ExprHa
13a30 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
13a40 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26  _xIsSelect).   &
13a50 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73  & (!sqlite3InRhs
13a60 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c  IsConstant(pX) |
13a70 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pX->x.pList->n
13a80 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20  Expr<=2).  ){.  
13a90 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
13aa0 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  EX_NOOP;.  }..  
13ab0 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
13ac0 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74      /* Could not
13ad0 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e   find an existin
13ae0 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
13af0 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
13b00 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
13b10 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
13b20 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
13b30 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
13b40 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
13b50 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65   */.    u32 save
13b60 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
13b70 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
13b80 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  ;.    int rMayHa
13b90 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
13ba0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
13bb0 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e  _EPH;.    if( in
13bc0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
13bd0 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70  _LOOP ){.      p
13be0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
13bf0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
13c00 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
13c10 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61  umn<0 && !ExprHa
13c20 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
13c30 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
13c40 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
13c50 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
13c60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
13c70 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
13c80 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68  l ){.      *prRh
13c90 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48  sHasNull = rMayH
13ca0 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
13cb0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a  se->nMem;.    }.
13cc0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
13cd0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
13ce0 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c   pX, rMayHaveNul
13cf0 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  l, eType==IN_IND
13d00 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70  EX_ROWID);.    p
13d10 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
13d20 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c  p = savedNQueryL
13d30 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oop;.  }else{.  
13d40 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
13d50 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Tab;.  }..  if( 
13d60 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d  aiMap && eType!=
13d70 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
13d80 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  SC && eType!=IN_
13d90 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
13da0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   ){.    int i, n
13db0 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
13dc0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
13dd0 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pX->pLeft);.    
13de0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
13df0 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b  +) aiMap[i] = i;
13e00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54  .  }.  return eT
13e10 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ype;.}.#endif..#
13e20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13e30 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
13e40 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72  * Argument pExpr
13e50 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29   is an (?, ?...)
13e60 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
13e70 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ion. This .** fu
13e80 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
13e90 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e   and returns a n
13ea0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
13eb0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
13ec0 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69  .** the affiniti
13ed0 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  es to be used fo
13ee0 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
13ef0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
13f00 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  .**.** It is the
13f10 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
13f20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
13f30 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
13f40 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72   returned.** str
13f50 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ing is eventuall
13f60 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  y freed using sq
13f70 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
13f80 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
13f90 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61  xprINAffinity(Pa
13fa0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
13fb0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
13fc0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
13fd0 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e  ->pLeft;.  int n
13fe0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
13ff0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
14000 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  t);.  Select *pS
14010 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e  elect = (pExpr->
14020 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
14030 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78  lect) ? pExpr->x
14040 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20  .pSelect : 0;.  
14050 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61  char *zRet;..  a
14060 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
14070 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65  ==TK_IN );.  zRe
14080 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
14090 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
140a0 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69  db, nVal+1);.  i
140b0 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69  f( zRet ){.    i
140c0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
140d0 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
140e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20  .      Expr *pA 
140f0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
14100 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
14110 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61  t, i);.      cha
14120 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  r a = sqlite3Exp
14130 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20  rAffinity(pA);. 
14140 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74       if( pSelect
14150 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
14160 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  [i] = sqlite3Com
14170 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65  pareAffinity(pSe
14180 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
14190 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20  i].pExpr, a);.  
141a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
141b0 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a     zRet[i] = a;.
141c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
141d0 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27    zRet[nVal] = '
141e0 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  \0';.  }.  retur
141f0 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
14200 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14210 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
14220 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61  *.** Load the Pa
14230 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  rse object passe
14240 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
14250 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  rgument with an 
14260 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
14270 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
14280 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
14290 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
142a0 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
142b0 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  M".*/   .void sq
142c0 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
142d0 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
142e0 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20  e, int nActual, 
142f0 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20  int nExpect){.  
14300 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
14310 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72   = "sub-select r
14320 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e  eturns %d column
14330 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22  s - expected %d"
14340 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
14350 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74  Msg(pParse, zFmt
14360 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65  , nActual, nExpe
14370 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ct);.}.#endif../
14380 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
14390 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f  pExpr is a vecto
143a0 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  r that has been 
143b0 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78  used in a contex
143c0 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73  t where.** it is
143d0 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
143e0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75  If pExpr is a su
143f0 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c  b-select vector,
14400 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a   this routine .*
14410 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73  * loads the Pars
14420 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20  e object with a 
14430 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
14440 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
14450 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
14460 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
14470 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f  ected 1".**.** O
14480 72 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  r, if it is a re
14490 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63  gular scalar vec
144a0 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f  tor:.**.**   "ro
144b0 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
144c0 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
144d0 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
144e0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
144f0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23   Expr *pExpr){.#
14500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14510 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
14520 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
14530 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b   EP_xIsSelect ){
14540 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73  .    sqlite3Subs
14550 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
14560 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  e, pExpr->x.pSel
14570 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
14580 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a  pr, 1);.  }else.
14590 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
145a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
145b0 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
145c0 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d  e misused");.  }
145d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
145e0 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
145f0 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
14600 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
14610 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49   expression, EXI
14620 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70  STS,.** or IN op
14630 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
14640 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
14650 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
14660 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
14670 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
14680 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
14690 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
146a0 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
146b0 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
146c0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
146d0 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
146e0 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
146f0 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
14700 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
14710 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
14720 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
14730 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
14740 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
14750 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
14760 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
14770 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
14780 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
14790 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
147a0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
147b0 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
147c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
147d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
147e0 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
147f0 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
14800 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
14810 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
14820 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
14830 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
14840 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
14850 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
14860 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
14870 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
14880 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
14890 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
148a0 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
148b0 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
148c0 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
148d0 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
148e0 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
148f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
14900 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
14910 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
14920 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
14930 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
14940 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
14950 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
14960 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
14970 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
14980 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  ** All this rout
14990 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
149a0 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73  ialize the regis
149b0 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
149c0 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  yHaveNull.** to 
149d0 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
149e0 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
149f0 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  e care of changi
14a00 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
14a10 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  .** value to non
14a20 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
14a30 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
14a40 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43  *.** For a SELEC
14a50 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  T or EXISTS oper
14a60 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ator, return the
14a70 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
14a80 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  olds the.** resu
14a90 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69  lt.  For a multi
14aa0 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20  -column SELECT, 
14ab0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
14ac0 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67  ored in a contig
14ad0 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66  uous.** array of
14ae0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
14af0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
14b00 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  is the register 
14b10 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
14b20 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
14b30 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72  n.  Return 0 for
14b40 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
14b50 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
14b60 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  urs..*/.#ifndef 
14b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14b80 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
14b90 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
14ba0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
14bc0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
14bd0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
14be0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14bf0 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
14c00 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
14c10 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c  /.  int rHasNull
14c20 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52  Flag,       /* R
14c30 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
14c40 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
14c50 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
14c60 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c80 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
14c90 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
14ca0 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
14cb0 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20  nt jmpIfDynamic 
14cc0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
14cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
14ce0 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
14cf0 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
14d00 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
14d30 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
14d40 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
14d50 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
14d60 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
14d70 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
14d80 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
14d90 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
14da0 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76  e);..  /* The ev
14db0 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
14dc0 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54  IN/EXISTS/SELECT
14dd0 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65   must be repeate
14de0 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a  d every time it.
14df0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
14e00 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  red if any of th
14e10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
14e20 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
14e30 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
14e40 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
14e50 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
14e60 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
14e70 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
14e80 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
14e90 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
14ea0 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
14eb0 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
14ec0 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
14ed0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
14ee0 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
14ef0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
14f00 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
14f10 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
14f20 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
14f30 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
14f40 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
14f50 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
14f60 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
14f70 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
14f80 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
14f90 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
14fa0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73  jmpIfDynamic = s
14fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14fc0 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
14fd0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14fe0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
14ff0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
15000 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
15010 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
15020 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
15030 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
15040 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45  se->db, "EXECUTE
15050 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25   %s%s SUBQUERY %
15060 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49  d",.        jmpI
15070 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22  fDynamic>=0?"":"
15080 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20  CORRELATED ",.  
15090 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
150a0 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53  =TK_IN?"LIST":"S
150b0 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20  CALAR",.        
150c0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
150d0 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20  ectId.    );.   
150e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
150f0 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
15100 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
15110 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
15120 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
15130 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74  }.#endif..  swit
15140 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
15150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
15160 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
15170 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
15180 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
15190 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
151a0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
151b0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
151c0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
151d0 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20  eft; /* the LHS 
151e0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
151f0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49  or */.      KeyI
15200 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
15210 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69  0;      /* Key i
15220 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
15230 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20      int nVal;   
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f  /* Size of vecto
15260 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20  r pLeft */.     
15270 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73   .      nVal = s
15280 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
15290 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  Size(pLeft);.   
152a0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
152b0 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29  wid || nVal==1 )
152c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
152d0 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
152e0 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
152f0 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
15300 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
15310 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
15320 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
15330 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70  same way.  An ep
15340 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73  hemeral table is
15350 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
15360 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65 79  d with index key
15370 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
15380 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
15390 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45  the .      ** SE
153a0 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
153b0 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
153c0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
153d0 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
153e0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
153f0 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
15400 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
15410 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
15420 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
15430 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
15440 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
15450 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
15460 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
15470 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
15480 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
15490 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
154a0 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
154b0 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
154c0 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
154d0 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
154e0 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
154f0 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
15500 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
15510 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
15520 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
15530 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
15540 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
15550 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
15560 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
15570 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
15580 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
15590 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
155a0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
155b0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
155c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
155d0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20  enEphemeral, .  
155e0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
155f0 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f  Table, (isRowid?
15600 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20 20  0:nVal));.      
15610 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77  pKeyInfo = isRow
15620 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  id ? 0 : sqlite3
15630 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
15640 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31  rse->db, nVal, 1
15650 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  );..      if( Ex
15660 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15670 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
15680 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
15690 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
156a0 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
156b0 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
156c0 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
156d0 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
156e0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
156f0 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
15700 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
15710 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
15720 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
15730 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
15740 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
15750 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45  ct *pSelect = pE
15760 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
15770 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
15780 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65   *pEList = pSele
15790 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20  ct->pEList;..   
157a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
157b0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
157c0 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61   /* If the LHS a
157d0 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  nd RHS of the IN
157e0 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
157f0 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20   match, that.   
15800 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69       ** error wi
15810 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75  ll have been cau
15820 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20  ght long before 
15830 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
15840 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  int. */.        
15850 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73  if( ALWAYS(pELis
15860 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20  t->nExpr==nVal) 
15870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
15880 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
15890 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
158a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
158b0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
158c0 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
158d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
158e0 20 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41           dest.zA
158f0 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41  ffSdst = exprINA
15900 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
15910 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
15920 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
15930 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
15940 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
15950 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ble );.         
15960 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
15970 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15980 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63  testcase( pSelec
15990 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
159a0 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
159b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
159c0 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20   pKeyInfo==0 ); 
159d0 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d  /* Caused by OOM
159e0 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e   in sqlite3KeyIn
159f0 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20  foAlloc() */.   
15a00 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
15a10 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
15a20 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
15a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15a40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
15a50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
15a60 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
15a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
15a80 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
15a90 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fo);.           
15aa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
15ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15ac0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
15ad0 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e  Parse->db, dest.
15ae0 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  zAffSdst);.     
15af0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
15b00 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f  yInfo!=0 ); /* O
15b10 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78  OM will cause ex
15b20 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  it after sqlite3
15b30 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20  Select() */.    
15b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
15b50 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  List!=0 );.     
15b60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
15b70 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
15b80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15b90 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
15ba0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
15bb0 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
15bc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
15bd0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
15be0 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
15bf0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
15c00 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
15c10 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
15c20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
15c30 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [i] = sqlite3Bin
15c40 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
15c50 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q(.             
15c60 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45     pParse, p, pE
15c70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
15c90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15cb0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
15cc0 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
15cd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
15ce0 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
15cf0 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
15d00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
15d10 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
15d20 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
15d30 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
15d40 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
15d50 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
15d60 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
15d70 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
15d80 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
15d90 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
15da0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
15db0 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
15dc0 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
15dd0 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
15de0 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
15df0 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
15e00 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
15e10 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
15e20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
15e30 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20  finity;         
15e40 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
15e50 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
15e60 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   IN */.        i
15e70 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
15e80 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
15e90 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
15ea0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
15eb0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
15ec0 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
15ed0 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
15ee0 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
15ef0 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
15f00 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20  nity(pLeft);.   
15f10 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
15f20 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
15f30 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
15f40 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
15f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
15f60 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
15f70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15f80 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
15f90 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
15fa0 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fo) );.         
15fb0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
15fc0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [0] = sqlite3Exp
15fd0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
15fe0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
15ff0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
16000 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
16010 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
16020 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
16030 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
16040 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16050 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
16060 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
16070 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16080 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
16090 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74   isRowid ) sqlit
160a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
160b0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b  OP_Null, 0, r2);
160c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
160d0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
160e0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
160f0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
16100 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
16110 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
16120 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
16130 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
16140 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
16150 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
16160 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
16170 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
16180 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
16190 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
161a0 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
161b0 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
161c0 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
161d0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
161e0 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
161f0 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
16200 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
16210 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
16220 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
16230 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
16240 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
16250 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
16260 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44        if( jmpIfD
16270 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71  ynamic>=0 && !sq
16280 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
16290 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
162a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
162b0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
162c0 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
162d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
162e0 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
162f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
16300 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
16310 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
16320 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
16330 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
16340 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
16350 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
16360 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
16370 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
16380 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
16390 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
163a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
163b0 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
163c0 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
163d0 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
163e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
163f0 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
16400 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
16410 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
16420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
16430 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
16440 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16460 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
16470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
164a0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
164c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
164e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
164f0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
16500 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
16510 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r3);.           
16520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16540 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
16550 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
16560 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
16570 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
16580 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16590 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
165a0 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b  (pParse, r3, 1);
165b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
165c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
165d0 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
165e0 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
165f0 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a  le, r2, r3, 1);.
16600 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
16610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16620 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
16630 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16640 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
16650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
16660 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16670 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
16680 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  }.      if( pKey
16690 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
166a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
166b0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
166c0 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
166d0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
166e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
166f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
16700 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
16710 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
16720 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
16730 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20       /* Case 3: 
16740 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46     (SELECT ... F
16750 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
16760 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58 49  *     or:    EXI
16770 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  STS(SELECT ... F
16780 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
16790 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
167a0 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74   SELECT, generat
167b0 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
167c0 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
167d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
167e0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
167f0 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ow into an array
16800 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
16810 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64  d return the ind
16820 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ex of.      ** t
16830 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
16840 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
16850 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
16860 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
16870 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
16880 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
16890 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20 2a  (exists).      *
168a0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
168b0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  r and return tha
168c0 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
168d0 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
168e0 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73    ** In both cas
168f0 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69 73  es, the query is
16900 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
16910 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79 20  "LIMIT 1".  Any 
16920 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78 69  .      ** preexi
16930 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64  sting limit is d
16940 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63  iscarded in plac
16950 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d  e of the new LIM
16960 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  IT 1..      */. 
16970 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
16980 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
16990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
169a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
169b0 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
169c0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
169d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
169e0 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
169f0 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
16a00 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  CT result */.   
16a10 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20     int nReg;    
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
16a40 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
16a50 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  e */..      test
16a60 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
16a70 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
16a80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
16a90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
16aa0 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
16ab0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
16ac0 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
16ad0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
16ae0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16af0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
16b00 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
16b10 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20  elect) );..     
16b20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
16b30 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
16b40 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70  nReg = pExpr->op
16b50 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53  ==TK_SELECT ? pS
16b60 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  el->pEList->nExp
16b70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  r : 1;.      sql
16b80 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
16b90 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61  it(&dest, 0, pPa
16ba0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20  rse->nMem+1);.  
16bb0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
16bc0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20   += nReg;.      
16bd0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
16be0 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
16bf0 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
16c00 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
16c10 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64    dest.iSdst = d
16c20 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
16c30 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20       dest.nSdst 
16c40 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20  = nReg;.        
16c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16c60 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
16c70 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
16c80 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
16c90 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
16ca0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
16cb0 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
16cc0 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
16cd0 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
16ce0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
16cf0 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
16d00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16d10 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
16d20 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
16d30 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
16d40 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58  ent((v, "Init EX
16d50 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
16d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
16d70 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
16d80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
16d90 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
16da0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
16db0 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
16dc0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
16dd0 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20  INTEGER,.       
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
16e00 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c  te3IntTokens[1],
16e10 20 30 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d   0);.      pSel-
16e20 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
16e30 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
16e40 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61  s &= ~SF_MultiVa
16e50 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  lue;.      if( s
16e60 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
16e70 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
16e80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
16e90 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
16ea0 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74       rReg = dest
16eb0 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
16ec0 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
16ed0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
16ee0 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72  educe);.      br
16ef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
16f00 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c    if( rHasNullFl
16f10 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
16f20 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
16f30 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  v, pExpr->iTable
16f40 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b  , rHasNullFlag);
16f50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49  .  }..  if( jmpI
16f60 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20  fDynamic>=0 ){. 
16f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16f80 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44  mpHere(v, jmpIfD
16f90 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73  ynamic);.  }.  s
16fa0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
16fb0 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72  op(pParse);..  r
16fc0 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65  eturn rReg;.}.#e
16fd0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16fe0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
16ff0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17000 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
17010 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20  .** Expr pIn is 
17020 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65  an IN(...) expre
17030 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ssion. This func
17040 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74  tion checks that
17050 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c   the .** sub-sel
17060 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ect on the RHS o
17070 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61  f the IN() opera
17080 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65  tor has the same
17090 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63   number of .** c
170a0 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65  olumns as the ve
170b0 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e  ctor on the LHS.
170c0 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20   Or, if the RHS 
170d0 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e  of the IN() is n
170e0 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65  ot .** a sub-que
170f0 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53  ry, that the LHS
17100 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20   is a vector of 
17110 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73  size 1..*/.int s
17120 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49  qlite3ExprCheckI
17130 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  N(Parse *pParse,
17140 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69   Expr *pIn){.  i
17150 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c  nt nVector = sql
17160 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
17170 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  ze(pIn->pLeft);.
17180 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67    if( (pIn->flag
17190 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
171a0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65  ) ){.    if( nVe
171b0 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65  ctor!=pIn->x.pSe
171c0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
171d0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
171e0 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
171f0 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  or(pParse, pIn->
17200 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
17210 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f  t->nExpr, nVecto
17220 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
17230 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
17240 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31  e if( nVector!=1
17250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
17260 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50  ectorErrorMsg(pP
17270 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74  arse, pIn->pLeft
17280 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
17290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
172a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
172b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
172c0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
172d0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
172e0 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  an IN expression
172f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  ..**.**      x I
17300 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
17310 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c  *      x IN (val
17320 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a  ue, value, ...).
17330 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68  **.** The left-h
17340 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69  and side (LHS) i
17350 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65  s a scalar or ve
17360 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ctor expression.
17370 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d    The .** right-
17380 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
17390 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a  is an array of z
173a0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c  ero or more scal
173b0 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a  ar values, or a.
173c0 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66  ** subquery.  If
173d0 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75   the RHS is a su
173e0 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62  bquery, the numb
173f0 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
17400 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74  umns must.** mat
17410 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
17420 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
17430 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
17440 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  S.  If the RHS i
17450 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76  s.** a list of v
17460 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d  alues, the LHS m
17470 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e  ust be a scalar.
17480 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f   .**.** The IN o
17490 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20  perator is true 
174a0 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65  if the LHS value
174b0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   is contained wi
174c0 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a  thin the RHS..**
174d0 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66   The result is f
174e0 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20  alse if the LHS 
174f0 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f  is definitely no
17500 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54  t in the RHS.  T
17510 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  he .** result is
17520 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65   NULL if the pre
17530 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53  sence of the LHS
17540 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e   in the RHS cann
17550 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d  ot be .** determ
17560 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c  ined due to NULL
17570 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
17580 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
17590 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20  code that jumps 
175a0 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
175b0 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
175c0 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
175d0 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
175e0 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
175f0 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
17600 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
17610 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
17620 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
17630 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
17640 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
17650 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
17660 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
17670 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
17680 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73  .**.** See the s
17690 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61  eparate in-opera
176a0 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61  tor.md documenta
176b0 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65  tion file in the
176c0 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51   canonical.** SQ
176d0 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65  Lite source tree
176e0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
176f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
17700 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
17710 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20  te3ExprCodeIN(. 
17720 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17730 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17740 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
17750 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
17760 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
17770 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17780 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  IN expression */
17790 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c  .  int destIfFal
177a0 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  se,      /* Jump
177b0 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20   here if LHS is 
177c0 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
177d0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
177e0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20  t destIfNull    
177f0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
17800 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
17810 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20  are unknown due 
17820 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20  to NULLs */.){. 
17830 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c   int rRhsHasNull
17840 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74   = 0;  /* Regist
17850 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20  er that is true 
17860 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  if RHS contains 
17870 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20  NULL values */. 
17880 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
17890 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
178a0 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  f the RHS */.  i
178b0 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20  nt rLhs;        
178c0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
178d0 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  (s) holding the 
178e0 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  LHS values */.  
178f0 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20  int rLhsOrig;   
17900 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c        /* LHS val
17910 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f  ues prior to reo
17920 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70  rdering by aiMap
17930 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  [] */.  Vdbe *v;
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17950 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
17960 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
17970 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20  .  int *aiMap = 
17980 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20  0;       /* Map 
17990 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c  from vector fiel
179a0 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d  d to index colum
179b0 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  n */.  char *zAf
179c0 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  f = 0;       /* 
179d0 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
179e0 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20  for comparisons 
179f0 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72  */.  int nVector
17a00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
17a10 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f  ze of vectors fo
17a20 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
17a30 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d  or */.  int iDum
17a40 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  my;           /*
17a50 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72   Dummy parameter
17a60 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74   to exprCodeVect
17a70 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a  or() */.  Expr *
17a80 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
17a90 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
17aa0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
17ab0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
17ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70           /* loop
17ad0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
17ae0 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20  t destStep2;    
17af0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
17b00 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20  jump when NULLs 
17b10 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a  seen in step 2 *
17b20 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70  /.  int destStep
17b30 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61  6 = 0;    /* Sta
17b40 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53  rt of code for S
17b50 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
17b60 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20  ddrTruthOp;     
17b70 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f   /* Address of o
17b80 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72  pcode that deter
17b90 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20  mines the IN is 
17ba0 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  true */.  int de
17bb0 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20  stNotNull;      
17bc0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
17bd0 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  a comparison is 
17be0 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70  not true in step
17bf0 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
17c00 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Top;          /*
17c10 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70   Top of the step
17c20 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70  -6 loop */ ..  p
17c30 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
17c40 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  eft;.  if( sqlit
17c50 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50  e3ExprCheckIN(pP
17c60 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72  arse, pExpr) ) r
17c70 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20  eturn;.  zAff = 
17c80 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
17c90 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
17ca0 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
17cb0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
17cc0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
17cd0 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29    aiMap = (int*)
17ce0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
17cf0 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73  ero(.      pPars
17d00 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28  e->db, nVector*(
17d10 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69  sizeof(int) + si
17d20 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a  zeof(char)) + 1.
17d30 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73    );.  if( pPars
17d40 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
17d50 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74  led ) goto sqlit
17d60 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d  e3ExprCodeIN_oom
17d70 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74  _error;..  /* At
17d80 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65  tempt to compute
17d90 20 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20   the RHS. After 
17da0 74 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e  this step, if an
17db0 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
17dc0 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  n.  ** IN_INDEX_
17dd0 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64  NOOP is returned
17de0 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e  , the table open
17df0 65 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45  ed ith cursor pE
17e00 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a  xpr->iTable .  *
17e10 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  * contains the v
17e20 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
17e30 75 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49  up the RHS. If I
17e40 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
17e50 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74  returned,.  ** t
17e60 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79  he RHS has not y
17e70 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20  et been coded.  
17e80 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
17e90 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
17ea0 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
17eb0 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20  /* OOM detected 
17ec0 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
17ed0 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e  utine */.  VdbeN
17ee0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
17ef0 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29  begin IN expr"))
17f00 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
17f10 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
17f20 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20  Parse, pExpr,.  
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e             IN_IN
17f50 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c  DEX_MEMBERSHIP |
17f60 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
17f70 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
17fa0 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72  tIfNull ? 0 : &r
17fb0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61  RhsHasNull, aiMa
17fc0 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  p);..  assert( p
17fd0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e  Parse->nErr || n
17fe0 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79  Vector==1 || eTy
17ff0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48  pe==IN_INDEX_EPH
18000 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
18010 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
18020 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49  _ASC || eType==I
18030 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
18040 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20  SC .  );.#ifdef 
18050 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
18060 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61  * Confirm that a
18070 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  iMap[] contains 
18080 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20  nVector integer 
18090 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30  values between 0
180a0 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f   and.  ** nVecto
180b0 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  r-1. */.  for(i=
180c0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
180d0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63  +){.    int j, c
180e0 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d  nt;.    for(cnt=
180f0 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20  j=0; j<nVector; 
18100 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a  j++) if( aiMap[j
18110 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20  ]==i ) cnt++;.  
18120 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31    assert( cnt==1
18130 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
18140 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48    /* Code the LH
18150 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  S, the <expr> fr
18160 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
18170 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53  ..)". If the LHS
18180 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74   is a .  ** vect
18190 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73  or, then it is s
181a0 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
181b0 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67  y of nVector reg
181c0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
181d0 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a  .  ** at r1..  *
181e0 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69  *.  ** sqlite3Fi
181f0 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68  ndInIndex() migh
18200 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64  t have reordered
18210 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74   the fields of t
18220 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20  he LHS vector.  
18230 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  ** so that the f
18240 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65  ields are in the
18250 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61   same order as a
18260 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  n existing index
18270 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d  .   The.  ** aiM
18280 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ap[] array conta
18290 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72  ins a mapping fr
182a0 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
182b0 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20  LHS field order 
182c0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c  to.  ** the fiel
182d0 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74  d order that mat
182e0 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64  ches the RHS ind
182f0 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
18300 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
18310 70 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f  pParse);.  rLhsO
18320 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65  rig = exprCodeVe
18330 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ctor(pParse, pLe
18340 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20  ft, &iDummy);.  
18350 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
18360 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d  or && aiMap[i]==
18370 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65  i; i++){} /* Are
18380 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72   LHS fields reor
18390 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20  dered? */.  if( 
183a0 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20  i==nVector ){.  
183b0 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20    /* LHS fields 
183c0 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65  are not reordere
183d0 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20  d */.    rLhs = 
183e0 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73  rLhsOrig;.  }els
183f0 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  e{.    /* Need t
18400 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48  o reorder the LH
18410 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69  S fields accordi
18420 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20  ng to aiMap */. 
18430 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65     rLhs = sqlite
18440 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
18450 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  arse, nVector);.
18460 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18470 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
18480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18490 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
184a0 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c  , rLhsOrig+i, rL
184b0 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b  hs+aiMap[i], 0);
184c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
184d0 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49   If sqlite3FindI
184e0 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74  nIndex() did not
184f0 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
18500 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
18510 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  .  ** suitable f
18520 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  or evaluating th
18530 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74  e IN operator, t
18540 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69  hen evaluate usi
18550 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ng a.  ** sequen
18560 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
18570 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
18580 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e  s is step (1) in
18590 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72   the in-operator
185a0 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c  .md optimized al
185b0 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20  gorithm..  */.  
185c0 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
185d0 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_NOOP ){.    
185e0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
185f0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
18600 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
18610 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
18620 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
18630 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
18640 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b  .    int labelOk
18650 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18660 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18670 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65  int r2, regToFre
18680 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b  e;.    int regCk
18690 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Null = 0;.    in
186a0 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74  t ii;.    assert
186b0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
186c0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
186d0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
186e0 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  f( destIfNull!=d
186f0 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
18700 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20      regCkNull = 
18710 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
18720 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
18730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18740 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
18750 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67   rLhs, rLhs, reg
18760 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  CkNull);.    }. 
18770 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
18780 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69  pList->nExpr; ii
18790 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  ++){.      r2 = 
187a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
187b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73  emp(pParse, pLis
187c0 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  t->a[ii].pExpr, 
187d0 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20  &regToFree);.   
187e0 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
187f0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
18800 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e  anBeNull(pList->
18810 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
18820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18830 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18840 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c  BitAnd, regCkNul
18850 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c  l, r2, regCkNull
18860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18870 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e   if( ii<pList->n
18880 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66  Expr-1 || destIf
18890 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
188a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
188b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
188c0 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c  , OP_Eq, rLhs, l
188d0 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20  abelOk, r2,.    
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
18900 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
18910 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
18920 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c  erageIf(v, ii<pL
18930 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
18940 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18950 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69  ageIf(v, ii==pLi
18960 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
18970 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18980 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66  eChangeP5(v, zAf
18990 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  f[0]);.      }el
189a0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
189b0 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  rt( destIfNull==
189c0 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20  destIfFalse );. 
189d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
189e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
189f0 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46  e, rLhs, destIfF
18a00 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20  alse, r2,.      
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
18a30 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56  , P4_COLLSEQ); V
18a40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18a60 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a  dbeChangeP5(v, z
18a70 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f  Aff[0] | SQLITE_
18a80 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
18a90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18aa0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18ab0 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72  (pParse, regToFr
18ac0 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
18ad0 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a  f( regCkNull ){.
18ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18af0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
18b00 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  Null, regCkNull,
18b10 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64   destIfNull); Vd
18b20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18b30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18b40 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
18b50 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lse);.    }.    
18b60 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18b70 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
18b80 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Ok);.    sqlite3
18b90 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18ba0 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c  Parse, regCkNull
18bb0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69  );.    goto sqli
18bc0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
18bd0 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f  nished;.  }..  /
18be0 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20  * Step 2: Check 
18bf0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
18c00 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  S contains any N
18c10 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66  ULL columns.  If
18c20 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f   the.  ** LHS do
18c30 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73  es contain NULLs
18c40 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
18c50 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
18c60 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20  FALSE or NULL.. 
18c70 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e   ** We will then
18c80 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79   skip the binary
18c90 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52   search of the R
18ca0 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  HS..  */.  if( d
18cb0 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
18cc0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65  fFalse ){.    de
18cd0 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66  stStep2 = destIf
18ce0 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  False;.  }else{.
18cf0 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20      destStep2 = 
18d00 64 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69  destStep6 = sqli
18d10 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18d20 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (v);.  }.  for(i
18d30 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
18d40 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
18d50 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
18d60 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78  FieldSubexpr(pEx
18d70 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pr->pLeft, i);. 
18d80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
18d90 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29  prCanBeNull(p) )
18da0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18db0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18dc0 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20  IsNull, rLhs+i, 
18dd0 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20  destStep2);.    
18de0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
18df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18e00 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20  /* Step 3.  The 
18e10 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e  LHS is now known
18e20 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e   to be non-NULL.
18e30 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20    Do the binary 
18e40 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74  search.  ** of t
18e50 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65  he RHS using the
18e60 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e   LHS as a probe.
18e70 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20    If found, the 
18e80 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74  result is.  ** t
18e90 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rue..  */.  if( 
18ea0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
18eb0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20  ROWID ){.    /* 
18ec0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
18ed0 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57  e RHS is the ROW
18ee0 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72  ID of table b-tr
18ef0 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73  ee and so we als
18f00 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68  o.    ** know th
18f10 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  at the RHS is no
18f20 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  n-NULL.  Hence, 
18f30 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73  we combine steps
18f40 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20   3 and 4.    ** 
18f50 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
18f60 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  code. */.    sql
18f70 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18f80 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
18f90 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
18fa0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73  estIfFalse, rLhs
18fb0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
18fc0 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
18fd0 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65  TruthOp = sqlite
18fe0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
18ff0 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74  P_Goto);  /* Ret
19000 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65  urn True */.  }e
19010 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
19020 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19030 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c  _Affinity, rLhs,
19040 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66   nVector, 0, zAf
19050 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  f, nVector);.   
19060 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
19070 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a  ==destIfNull ){.
19080 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
19090 20 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70   Step 3 and Step
190a0 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65   5 into a single
190b0 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   opcode */.     
190c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
190d0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
190e0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
190f0 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
19100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68               rLh
19120 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62  s, nVector); Vdb
19130 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19140 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
19150 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
19160 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  hed;.    }.    /
19170 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20  * Ordinary Step 
19180 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  3, for the case 
19190 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20  where FALSE and 
191a0 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63  NULL are distinc
191b0 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75  t */.    addrTru
191c0 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
191d0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
191e0 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
191f0 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20  iTable, 0,.     
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b   rLhs, nVector);
19230 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19240 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
19250 20 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20   4.  If the RHS 
19260 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e  is known to be n
19270 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64  on-NULL and we d
19280 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a  id not find.  **
19290 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65   an match on the
192a0 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74   search above, t
192b0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
192c0 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20  ust be FALSE..  
192d0 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73  */.  if( rRhsHas
192e0 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d  Null && nVector=
192f0 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
19300 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19310 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48  P_NotNull, rRhsH
19320 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61  asNull, destIfFa
19330 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  lse);.    VdbeCo
19340 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
19350 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66    /* Step 5.  If
19360 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
19370 61 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72  about the differ
19380 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c  ence between NUL
19390 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45  L and.  ** FALSE
193a0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
193b0 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a  rn false. .  */.
193c0 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73    if( destIfFals
193d0 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20  e==destIfNull ) 
193e0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
193f0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
19400 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c  ..  /* Step 6: L
19410 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73  oop through rows
19420 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f   of the RHS.  Co
19430 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74  mpare each row t
19440 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20  o the LHS..  ** 
19450 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f  If any compariso
19460 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  n is NULL, then 
19470 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
19480 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a  LL.  If all.  **
19490 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65   comparisons are
194a0 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20   FALSE then the 
194b0 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20  final result is 
194c0 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  FALSE..  **.  **
194d0 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48   For a scalar LH
194e0 53 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69  S, it is suffici
194f0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73  ent to check jus
19500 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a  t the first row.
19510 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e    ** of the RHS.
19520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
19530 53 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56  Step6 ) sqlite3V
19540 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19550 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20  v, destStep6);. 
19560 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
19570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19580 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
19590 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
195a0 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  False);.  VdbeCo
195b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
195c0 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
195d0 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
195e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
195f0 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65  abel(v);.  }else
19600 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65  {.    /* For nVe
19610 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65  ctor==1, combine
19620 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62   steps 6 and 7 b
19630 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  y immediately re
19640 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46  turning.    ** F
19650 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73  ALSE if the firs
19660 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  t comparison is 
19670 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  not NULL */.    
19680 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65  destNotNull = de
19690 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20  stIfFalse;.  }. 
196a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
196b0 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  tor; i++){.    E
196c0 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c  xpr *p;.    Coll
196d0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
196e0 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33  int r3 = sqlite3
196f0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19700 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  e);.    p = sqli
19710 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
19720 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
19730 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
19740 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
19750 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
19760 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19770 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
19780 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69  pExpr->iTable, i
19790 2c 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r3);.    sqlit
197a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
197b0 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64  OP_Ne, rLhs+i, d
197c0 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a  estNotNull, r3,.
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
197f0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
19800 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
19810 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
19820 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19830 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d  pParse, r3);.  }
19840 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19850 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
19860 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b   0, destIfNull);
19870 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31  .  if( nVector>1
19880 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
19890 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
198a0 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b  v, destNotNull);
198b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
198c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
198d0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
198e0 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20  , addrTop+1);.  
198f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
19900 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20  );..    /* Step 
19910 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20  7:  If we reach 
19920 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
19930 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73  now that the res
19940 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ult must.    ** 
19950 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20  be false. */.   
19960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19970 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19980 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
19990 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20    }..  /* Jumps 
199a0 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  here in order to
199b0 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f   return true. */
199c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
199d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72  mpHere(v, addrTr
199e0 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33  uthOp);..sqlite3
199f0 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
19a00 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21  hed:.  if( rLhs!
19a10 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69  =rLhsOrig ) sqli
19a20 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19a30 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b  g(pParse, rLhs);
19a40 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
19a50 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
19a60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19a70 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
19a80 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  );.sqlite3ExprCo
19a90 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a  deIN_oom_error:.
19aa0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19ab0 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61  pParse->db, aiMa
19ac0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
19ad0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
19ae0 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  zAff);.}.#endif 
19af0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
19b00 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
19b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19b20 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
19b30 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
19b40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
19b50 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
19b60 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
19b70 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
19b80 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
19b90 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
19ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
19bb0 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
19bc0 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
19bd0 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
19be0 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
19bf0 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
19c00 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
19c10 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
19c20 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
19c30 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
19c40 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
19c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19c60 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
19c70 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
19c80 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
19c90 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
19ca0 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
19cb0 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
19cc0 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
19cd0 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
19ce0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19cf0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
19d00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
19d10 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
19d20 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
19d30 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
19d40 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
19d50 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
19d60 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
19d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19d80 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
19d90 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
19da0 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
19db0 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
19dc0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
19dd0 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
19de0 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
19df0 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
19e00 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
19e10 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
19e20 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
19e30 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
19e40 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
19e50 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
19e60 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
19e70 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
19e80 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
19e90 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
19ea0 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
19eb0 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
19ec0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
19ed0 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
19ee0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
19ef0 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
19f00 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
19f10 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
19f20 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
19f30 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
19f40 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
19f50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19f60 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
19f70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19f80 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
19f90 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
19fa0 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
19fb0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
19fc0 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
19fd0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63    c = sqlite3Dec
19fe0 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
19ff0 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63  alue);.    if( c
1a000 3d 3d 31 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20  ==1 || (c==2 && 
1a010 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 6e 65  !negFlag) || (ne
1a020 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d  gFlag && value==
1a030 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29  SMALLEST_INT64))
1a040 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1a050 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1a060 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
1a070 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a080 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
1a090 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
1a0a0 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
1a0b0 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
1a0c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
1a0d0 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
1a0e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1a0f0 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
1a100 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1a110 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a120 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
1a130 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73  al too big: %s%s
1a140 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22  ", negFlag?"-":"
1a150 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ",z);.      }els
1a160 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
1a170 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1a180 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
1a190 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   iMem);.      }.
1a1a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1a1b0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  {.      if( negF
1a1c0 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
1a1d0 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==2 ? SMALLEST_I
1a1e0 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
1a1f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a200 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1a210 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
1a220 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1a230 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1a240 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1a250 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61   Erase column-ca
1a260 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  che entry number
1a270 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   i.*/.static voi
1a280 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
1a290 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1a2a0 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70   int i){.  if( p
1a2b0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1a2c0 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20  [i].tempReg ){. 
1a2d0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1a2e0 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1a2f0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1a300 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eg) ){.      pPa
1a310 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
1a320 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
1a330 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1a340 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
1a350 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
1a360 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  e->nColCache--;.
1a370 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d 3e    if( i<pParse->
1a380 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20  nColCache ){.   
1a390 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1a3a0 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
1a3b0 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1a3c0 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20  ->nColCache];.  
1a3d0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
1a3e0 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
1a3f0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
1a400 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
1a410 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
1a420 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
1a430 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
1a440 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
1a450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1a460 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
1a470 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1a480 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
1a490 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1a4a0 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
1a4b0 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
1a4c0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1a4d0 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
1a4e0 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
1a4f0 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
1a500 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
1a510 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
1a520 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
1a530 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
1a540 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
1a550 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
1a570 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
1a580 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
1a590 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
1a5a0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
1a5b0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1a5c0 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
1a5d0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a5e0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
1a5f0 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
1a600 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
1a610 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
1a620 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
1a630 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
1a640 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
1a650 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a660 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
1a670 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1a680 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
1a690 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
1a6a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
1a6b0 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
1a6c0 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
1a6d0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
1a6e0 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
1a6f0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a700 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
1a710 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
1a720 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
1a730 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
1a740 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
1a750 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
1a760 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
1a770 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
1a780 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
1a790 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1a7a0 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
1a7b0 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
1a7c0 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
1a7d0 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54  t( p->iTable!=iT
1a7e0 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab || p->iColumn
1a7f0 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65  !=iCol );.  }.#e
1a800 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1a810 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65 61  e cache is alrea
1a820 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20  dy full, delete 
1a830 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e 74  the least recent
1a840 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a 2f  ly used entry */
1a850 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1a860 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54 45  ColCache>=SQLITE
1a870 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20  _N_COLCACHE ){. 
1a880 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66     minLru = 0x7f
1a890 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78 4c  ffffff;.    idxL
1a8a0 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  ru = -1;.    for
1a8b0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1a8c0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1a8d0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1a8e0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
1a8f0 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
1a900 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64  ru ){.        id
1a910 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20  xLru = i;.      
1a920 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72    minLru = p->lr
1a930 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  u;.      }.    }
1a940 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
1a950 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
1a960 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ru];.  }else{.  
1a970 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1a980 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d  ColCache[pParse-
1a990 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20  >nColCache++];. 
1a9a0 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
1a9b0 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68   new entry to th
1a9c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
1a9d0 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65  he */.  p->iLeve
1a9e0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
1a9f0 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54  heLevel;.  p->iT
1aa00 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 70  able = iTab;.  p
1aa10 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
1aa20 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52  ;.  p->iReg = iR
1aa30 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67  eg;.  p->tempReg
1aa40 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d   = 0;.  p->lru =
1aa50 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1aa60 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  nt++;.}../*.** I
1aa70 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67  ndicate that reg
1aa80 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69  isters between i
1aa90 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31  Reg..iReg+nReg-1
1aaa0 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77   are being overw
1aab0 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65  ritten..** Purge
1aac0 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
1aad0 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65  gisters from the
1aae0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
1aaf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1ab00 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61  prCacheRemove(Pa
1ab10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1ab20 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
1ab30 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1ab40 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65   while( i<pParse
1ab50 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20  ->nColCache ){. 
1ab60 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
1ab70 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73 65  che *p = &pParse
1ab80 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a  ->aColCache[i];.
1ab90 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
1aba0 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52  >= iReg && p->iR
1abb0 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29  eg < iReg+nReg )
1abc0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
1abd0 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1abe0 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
1abf0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
1ac00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
1ac10 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e  ember the curren
1ac20 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63  t column cache c
1ac30 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77  ontext.  Any new
1ac40 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a   entries added.*
1ac50 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  * added to the c
1ac60 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65  olumn cache afte
1ac70 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20  r this call are 
1ac80 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65  removed when the
1ac90 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
1aca0 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f  g pop occurs..*/
1acb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1acc0 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65  rCachePush(Parse
1acd0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
1ace0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1acf0 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ++;.#ifdef SQLIT
1ad00 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1ad10 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1ad20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
1ad30 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
1ad40 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25  rintf("PUSH to %
1ad50 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43  d\n", pParse->iC
1ad60 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  acheLevel);.  }.
1ad70 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1ad80 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20  Remove from the 
1ad90 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79  column cache any
1ada0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65   entries that we
1adb0 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74  re added since t
1adc0 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  he.** the previo
1add0 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  us sqlite3ExprCa
1ade0 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f  chePush operatio
1adf0 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
1ae00 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74  ds, restore.** t
1ae10 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65 20  he cache to the 
1ae20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1ae30 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  prior the most r
1ae40 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76  ecent Push..*/.v
1ae50 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1ae60 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
1ae70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 20  Parse){.  int i 
1ae80 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
1ae90 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1aea0 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73  el>=1 );.  pPars
1aeb0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d  e->iCacheLevel--
1aec0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1aed0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
1aee0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1aef0 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
1af00 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
1af10 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c  ntf("POP  to %d\
1af20 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63  n", pParse->iCac
1af30 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65  heLevel);.  }.#e
1af40 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69 3c  ndif.  while( i<
1af50 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1af60 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1af70 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1af80 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ].iLevel>pParse-
1af90 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
1afa0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
1afb0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29  Clear(pParse, i)
1afc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1afd0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     i++;.    }.  
1afe0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
1aff0 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  a cached column 
1b000 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20  is reused, make 
1b010 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65  sure that its re
1b020 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20  gister is.** no 
1b030 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65  longer available
1b040 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73   as a temp regis
1b050 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38  ter.  ticket #38
1b060 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a  79:  that same.*
1b070 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74  * register might
1b080 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
1b090 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
1b0a0 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20  ces, so be sure 
1b0b0 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61  to.** get them a
1b0c0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
1b0d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1b0e0 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50  chePinRegister(P
1b0f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1b100 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
1b110 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1b120 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
1b130 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1b140 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1b150 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1b160 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1b170 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
1b180 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  {.      p->tempR
1b190 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
1b1a0 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  }.}../* Generate
1b1b0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1b1c0 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74  load into regist
1b1d0 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75  er regOut a valu
1b1e0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70  e that is.** app
1b1f0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1b200 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75   iIdxCol-th colu
1b210 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
1b220 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b230 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
1b240 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  exColumn(.  Pars
1b250 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54  e *pParse,  /* T
1b260 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1b270 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
1b280 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69  Idx,    /* The i
1b290 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d  ndex whose colum
1b2a0 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65  n is to be loade
1b2b0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
1b2c0 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur,    /* Cursor
1b2d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
1b2e0 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  able row */.  in
1b2f0 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a  t iIdxCol,    /*
1b300 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   The column of t
1b310 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c  he index to be l
1b320 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
1b330 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74  egOut      /* St
1b340 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  ore the index co
1b350 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
1b360 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1b370 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20  {.  i16 iTabCol 
1b380 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1b390 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28  [iIdxCol];.  if(
1b3a0 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50   iTabCol==XN_EXP
1b3b0 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
1b3c0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
1b3d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b3e0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e  Idx->aColExpr->n
1b3f0 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a  Expr>iIdxCol );.
1b400 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1b410 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b 0a  fTab = iTabCur;.
1b420 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b430 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1b440 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1b450 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1b460 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1b470 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1b480 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1b490 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  OfTable(pParse->
1b4a0 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61  pVdbe, pIdx->pTa
1b4b0 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20  ble, iTabCur,.  
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75    iTabCol, regOu
1b4f0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1b500 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b510 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1b520 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  lue of the iCol-
1b530 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  th column of a t
1b540 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
1b550 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1b560 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20  ColumnOfTable(. 
1b570 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1b580 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64   /* The VDBE und
1b590 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1b5a0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1b5b0 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1b5c0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1b5d0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
1b5e0 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54  iTabCur,    /* T
1b5f0 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  he table cursor.
1b600 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73    Or the PK curs
1b610 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  or for WITHOUT R
1b620 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43  OWID */.  int iC
1b630 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ol,       /* Ind
1b640 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
1b650 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20   to extract */. 
1b660 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1b670 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1b680 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20  value into this 
1b690 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1b6a0 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
1b6b0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
1b6c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b6d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b6e0 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
1b6f0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
1b700 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
1b710 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
1b720 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
1b730 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  _Column;.    int
1b740 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69   x = iCol;.    i
1b750 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1b760 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  b) && !IsVirtual
1b770 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1b780 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
1b790 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
1b7a0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1b7b0 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
1b7c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1b7d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1b7e0 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
1b7f0 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
1b800 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
1b810 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
1b820 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
1b830 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1b840 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b850 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1b860 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
1b870 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
1b880 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
1b890 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
1b8a0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1b8b0 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a  a register. .**.
1b8c0 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20  ** An effort is 
1b8d0 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
1b8e0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1b8f0 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
1b900 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74    This.** is not
1b910 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20   garanteeed for 
1b920 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68  GetColumn() - th
1b930 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20  e result can be 
1b940 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79  stored in.** any
1b950 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74 20   register.  But 
1b960 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75  the result is gu
1b970 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64  aranteed to land
1b980 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1b990 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75  g.** for GetColu
1b9a0 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a  mnToReg()..**.**
1b9b0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1b9c0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
1b9d0 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
1b9e0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1b9f0 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
1ba00 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
1ba10 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
1ba20 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
1ba30 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
1ba40 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1ba50 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
1ba60 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ba70 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1ba80 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1ba90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1baa0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1bab0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1bac0 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1bad0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1bae0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1baf0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1bb00 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1bb10 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1bb20 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1bb30 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1bb40 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1bb50 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
1bb60 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1bb70 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
1bb80 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
1bb90 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
1bba0 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20  _Column + FLAGS 
1bbb0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1bbc0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1bbd0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1bbe0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1bbf0 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
1bc00 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1bc10 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
1bc20 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29  Cache; i++, p++)
1bc30 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
1bc40 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
1bc50 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
1bc60 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
1bc70 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
1bc80 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
1bc90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1bca0 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
1bcb0 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
1bcc0 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
1bcd0 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
1bce0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
1bcf0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1bd00 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1bd10 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
1bd20 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
1bd30 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
1bd40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1bd50 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
1bd60 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20  .  }else{   .   
1bd70 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1bd80 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1bd90 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
1bda0 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iReg);.  }.  ret
1bdb0 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64  urn iReg;.}.void
1bdc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bdd0 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a  GetColumnToReg(.
1bde0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1bdf0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
1be00 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1be10 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
1be20 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
1be30 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1be40 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
1be50 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
1be60 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1be70 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
1be80 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
1be90 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
1bea0 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
1beb0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
1bec0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
1bed0 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
1bee0 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
1bef0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
1bf00 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
1bf10 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1bf20 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
1bf30 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65   iColumn, iTable
1bf40 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66  , iReg, 0);.  if
1bf50 28 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c  ( r1!=iReg ) sql
1bf60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1bf70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1bf80 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67  _SCopy, r1, iReg
1bf90 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  );.}.../*.** Cle
1bfa0 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
1bfb0 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
1bfc0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1bfd0 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
1bfe0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
1bff0 20 69 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   i;..#if SQLITE_
1c000 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
1c010 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1c020 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
1c030 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
1c040 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a  ntf("CLEAR\n");.
1c050 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
1c060 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
1c070 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b  nColCache; i++){
1c080 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1c090 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65  >aColCache[i].te
1c0a0 6d 70 52 65 67 0a 20 20 20 20 20 26 26 20 70 50  mpReg.     && pP
1c0b0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
1c0c0 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
1c0d0 3e 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29  >aTempReg).    )
1c0e0 7b 0a 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  {.       pParse-
1c0f0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
1c100 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
1c110 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1c120 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d  e[i].iReg;.    }
1c130 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1c140 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a  ColCache = 0;.}.
1c150 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
1c160 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
1c170 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
1c180 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
1c190 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
1c1a0 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
1c1b0 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
1c1c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c1d0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1c1e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c1f0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
1c200 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
1c210 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1c220 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
1c230 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
1c240 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1c250 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
1c260 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
1c270 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
1c280 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
1c290 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
1c2a0 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
1c2b0 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
1c2c0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1c2d0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
1c2e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1c2f0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1c300 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61  , int nReg){.  a
1c310 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
1c320 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
1c330 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
1c340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c350 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1c360 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
1c370 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71  iTo, nReg);.  sq
1c380 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1c390 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72  move(pParse, iFr
1c3a0 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69  om, nReg);.}..#i
1c3b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c3c0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1c3d0 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
1c3e0 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  GE_TEST)./*.** R
1c3f0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
1c400 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  y register in th
1c410 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69  e range iFrom..i
1c420 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a  To (inclusive).*
1c430 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  * is used as par
1c440 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
1c450 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
1c460 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1c470 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  d within assert(
1c480 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29  ) and testcase()
1c490 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20   macros only.** 
1c4a0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  and does not app
1c4b0 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20  ear in a normal 
1c4c0 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
1c4d0 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d   int usedAsColum
1c4e0 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
1c4f0 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1c500 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
1c510 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1c520 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1c530 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1c540 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
1c550 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1c560 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1c570 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
1c580 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d      if( r>=iFrom
1c590 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74   && r<=iTo ) ret
1c5a0 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54  urn 1;    /*NO_T
1c5b0 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  EST*/.  }.  retu
1c5c0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1c5d0 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c  * SQLITE_DEBUG |
1c5e0 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  | SQLITE_COVERAG
1c5f0 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
1c600 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c  * Convert a scal
1c610 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ar expression no
1c620 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
1c630 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a  TER referencing.
1c640 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67  ** register iReg
1c650 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  .  The caller mu
1c660 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  st ensure that i
1c670 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  Reg already cont
1c680 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72  ains.** the corr
1c690 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1c6a0 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  e expression..*/
1c6b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1c6c0 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
1c6d0 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
1c6e0 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
1c6f0 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
1c700 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
1c710 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
1c720 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
1c730 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
1c740 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20  ./*.** Evaluate 
1c750 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  an expression (e
1c760 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f  ither a vector o
1c770 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
1c780 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65  ssion) and store
1c790 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
1c7a0 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65  n continguous te
1c7b0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1c7c0 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  s.  Return the i
1c7d0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ndex of.** the f
1c7e0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73  irst register us
1c7f0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1c800 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  result..**.** If
1c810 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1c820 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
1c830 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61   a temporary sca
1c840 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77  lar, then also w
1c850 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67  rite.** that reg
1c860 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74  ister number int
1c870 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20  o *piFreeable.  
1c880 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1c890 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a  result register.
1c8a0 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  ** is not a temp
1c8b0 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20  orary or if the 
1c8c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1c8d0 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72  vector set *piFr
1c8e0 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a  eeable.** to 0..
1c8f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1c900 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72  prCodeVector(Par
1c910 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1c920 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65   *p, int *piFree
1c930 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  able){.  int iRe
1c940 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73  sult;.  int nRes
1c950 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1c960 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a  rVectorSize(p);.
1c970 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31    if( nResult==1
1c980 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20   ){.    iResult 
1c990 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c9a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c  eTemp(pParse, p,
1c9b0 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20   piFreeable);.  
1c9c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72  }else{.    *piFr
1c9d0 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  eeable = 0;.    
1c9e0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  if( p->op==TK_SE
1c9f0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69 52  LECT ){.      iR
1ca00 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43  esult = sqlite3C
1ca10 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
1ca20 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20  rse, p, 0, 0);. 
1ca30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65  int i;.      iRe
1ca50 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
1ca60 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61  Mem+1;.      pPa
1ca70 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1ca80 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  sult;.      for(
1ca90 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20  i=0; i<nResult; 
1caa0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
1cab0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63  lite3ExprCodeFac
1cac0 74 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20  torable(pParse, 
1cad0 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
1cae0 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c  .pExpr, i+iResul
1caf0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1cb00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
1cb10 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Result;.}.../*.*
1cb20 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cb30 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
1cb40 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
1cb50 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
1cb60 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
1cb70 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
1cb80 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1cb90 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
1cba0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
1cbb0 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
1cbc0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
1cbd0 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
1cbe0 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
1cbf0 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
1cc00 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
1cc10 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
1cc20 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1cc30 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
1cc40 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
1cc50 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
1cc60 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
1cc70 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
1cc80 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1cc90 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
1cca0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1ccb0 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
1ccc0 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
1ccd0 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
1cce0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ccf0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
1cd00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1cd10 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1cd20 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
1cd30 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1cd40 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
1cd50 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1cd60 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
1cd90 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
1cda0 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
1cdb0 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
1cdc0 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
1cdd0 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
1cde0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1cdf0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1ce00 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1ce10 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1ce20 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1ce30 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
1ce40 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1ce50 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1ce60 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1ce70 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
1ce80 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
1ce90 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
1cea0 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
1ceb0 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20  .  Expr tempX;  
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ced0 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
1cee0 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  sion node */.  i
1cef0 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73  nt p5 = 0;..  as
1cf00 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
1cf10 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
1cf20 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
1cf30 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
1cf40 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
1cf50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1cf60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1cf70 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
1cf80 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1cf90 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1cfa0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1cfb0 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1cfc0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1cfd0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1cfe0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1cff0 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1d000 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1d010 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1d020 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1d030 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1d040 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1d050 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1d060 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1d070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d080 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1d090 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1d0a0 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1d0b0 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1d0c0 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1d0d0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1d0e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1d0f0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1d100 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1d110 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1d140 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1d150 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1d160 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1d170 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1d180 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1d190 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1d1a0 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1d1b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1d1c0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1d1d0 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1d1e0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1d1f0 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1d200 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
1d210 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  kBase>0 ){.     
1d220 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
1d230 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
1d240 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
1d250 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
1d260 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
1d270 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1d280 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
1d290 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
1d2a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d2b0 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20     /* Coding an 
1d2c0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1d2d0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  is part of an in
1d2e0 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e  dex where column
1d2f0 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20   names.         
1d300 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1d310 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
1d320 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ble to which the
1d330 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a   index belongs *
1d340 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62  /.          iTab
1d350 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   = pParse->iSelf
1d360 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Tab;.        }. 
1d370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1d380 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1d390 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1d3a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1d3b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1d3e0 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1d410 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1d420 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1d430 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1d440 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1d450 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1d460 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1d470 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1d480 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d490 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1d4a0 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
1d4b0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
1d4c0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d4d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d4e0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d4f0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1d500 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1d510 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1d520 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1d530 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1d540 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1d550 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
1d560 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d570 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1d580 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1d590 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1d5a0 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
1d5b0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1d5c0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
1d5d0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1d5e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1d5f0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1d600 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d610 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1d620 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d630 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1d640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d650 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1d660 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1d670 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
1d680 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1d690 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
1d6a0 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
1d6b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d6c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d6d0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d6e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1d6f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1d700 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
1d710 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
1d720 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d730 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1d740 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
1d750 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
1d760 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
1d770 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1d780 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
1d790 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
1d7a0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1d7b0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
1d7c0 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
1d7d0 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
1d7e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d7f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
1d800 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
1d810 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
1d820 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72  YNAMIC);.      r
1d830 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1d840 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1d850 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1d860 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1d870 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d880 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1d890 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1d8a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1d8b0 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
1d8c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1d8d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
1d8e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d8f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d900 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
1d910 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
1d920 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
1d930 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1d940 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
1d950 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1d960 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
1d970 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56  oName(pParse->pV
1d980 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f  List, pExpr->iCo
1d990 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  lumn);.        a
1d9a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1d9b0 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c  zToken[0]=='?' |
1d9c0 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
1d9d0 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20  u.zToken, z)==0 
1d9e0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
1d9f0 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30  e->pVList[0] = 0
1da00 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c  ; /* Indicate VL
1da10 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65  ist may no longe
1da20 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  r be enlarged */
1da30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1da40 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
1da50 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41  (char*)z, P4_STA
1da60 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
1da70 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1da80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1da90 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
1daa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
1dab0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1dac0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1dad0 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
1dae0 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
1daf0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
1db00 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
1db10 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
1db20 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
1db30 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1db40 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1db50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1db60 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1db70 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1db80 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1db90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dba0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
1dbb0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
1dbc0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1dbd0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1dbe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1dbf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1dc00 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ast, target,.   
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69       sqlite3Affi
1dc30 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
1dc40 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20  u.zToken, 0));. 
1dc50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
1dc60 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1dc70 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1dc80 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
1dc90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1dca0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1dcb0 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
1dcc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  ;.      return i
1dcd0 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  nReg;.    }.#end
1dce0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1dcf0 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1dd00 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1dd10 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
1dd20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
1dd30 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
1dd40 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20  _NE;.      p5 = 
1dd50 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
1dd60 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72       /* fall-thr
1dd70 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
1dd80 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1dd90 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1dda0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1ddb0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1ddc0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1ddd0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1dde0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1ddf0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1de00 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1de10 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29  rIsVector(pLeft)
1de20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1de30 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50  VectorCompare(pP
1de40 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1de50 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20  get, op, p5);.  
1de60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1de70 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1de80 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1de90 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46  se, pLeft, &regF
1dea0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
1deb0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1dec0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ded0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1dee0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1def0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1df00 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45  Parse, pLeft, pE
1df10 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1df20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c  .            r1,
1df30 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
1df40 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29  TE_STOREP2 | p5)
1df50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1df60 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
1df70 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1df80 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
1df90 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
1dfa0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1dfb0 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1dfc0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1dfd0 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1dfe0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1dff0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e000 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1e010 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e020 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1e030 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1e040 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e050 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
1e060 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e070 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
1e080 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
1e090 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e0a0 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
1e0b0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e0c0 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
1e0d0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
1e0e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e0f0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
1e100 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e110 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
1e120 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
1e130 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1e140 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e150 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1e160 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1e170 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1e180 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e190 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
1e1a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
1e1b0 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1e1c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
1e1d0 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
1e1e0 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
1e1f0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
1e200 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
1e210 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
1e220 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
1e230 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
1e240 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
1e250 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
1e260 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
1e270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e280 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
1e290 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1e2a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
1e2b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e2c0 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29  ( TK_OR==OP_Or )
1e2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ;              t
1e2e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e2f0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1e300 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
1e310 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  Add );          
1e320 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e330 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
1e340 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
1e350 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
1e360 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e370 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
1e380 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e390 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
1e3a0 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  r );      testca
1e3b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29  se( op==TK_REM )
1e3c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e3d0 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
1e3e0 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73  tAnd );      tes
1e3f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1e400 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  TAND );.      as
1e410 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
1e420 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20  OP_BitOr );     
1e430 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e440 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
1e450 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
1e460 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
1e470 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;       testcase
1e480 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
1e490 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e4a0 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
1e4b0 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73  iftLeft );   tes
1e4c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
1e4d0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1e4e0 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d  sert( TK_RSHIFT=
1e4f0 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29  =OP_ShiftRight )
1e500 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1e510 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
1e520 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
1e530 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
1e540 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1e550 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54  e( op==TK_CONCAT
1e560 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1e570 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e580 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e590 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e5a0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1e5b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e5c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e5d0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1e5e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree2);.      sql
1e5f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e600 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61  , op, r2, r1, ta
1e610 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73  rget);.      tes
1e620 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1e630 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1e640 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1e650 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e670 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
1e680 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1e690 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1e6a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1e6b0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
1e6c0 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
1e6d0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1e6e0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1e6f0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20  arse, pLeft, 1, 
1e700 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1e710 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e720 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e730 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1e740 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
1e750 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1e760 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
1e770 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e780 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e790 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e7a0 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
1e7b0 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
1e7c0 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
1e7d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e7e0 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66  n target;.#endif
1e7f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e800 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d        tempX.op =
1e810 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
1e820 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73       tempX.flags
1e830 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   = EP_IntValue|E
1e840 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
1e850 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61       tempX.u.iVa
1e860 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lue = 0;.       
1e870 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e880 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e890 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
1e8a0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1e8b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e8c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e8d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1e8e0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1e8f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e900 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
1e910 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
1e920 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
1e930 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1e940 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1e950 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e960 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
1e970 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
1e980 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
1e990 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
1e9a0 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74  OP_BitNot );   t
1e9b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e9c0 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
1e9d0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
1e9e0 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20  OP_Not );       
1e9f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ea00 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
1ea10 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ea20 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ea30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1ea40 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ea50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ea60 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1ea70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ea80 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
1ea90 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
1eaa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eab0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1eac0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1ead0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
1eae0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1eaf0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1eb00 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1eb10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1eb20 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1eb30 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1eb40 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1eb50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1eb60 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1eb70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eb80 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1eb90 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1eba0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ebb0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ebc0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ebd0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1ebe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1ebf0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1ec00 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1ec10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
1ec20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
1ec30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ec40 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1ec50 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ec60 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1ec70 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
1ec80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ec90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1eca0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1ecb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1ecc0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
1ecd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ece0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1ecf0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1ed00 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
1ed10 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1ed20 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
1ed30 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
1ed40 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ed50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ed60 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ed70 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
1ed80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ed90 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
1eda0 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
1edb0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1edc0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1edd0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ede0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
1edf0 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
1ee00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1ee10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ee20 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1ee30 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1ee40 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1ee50 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1ee60 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1ee70 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
1ee80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ee90 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
1eea0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1eeb0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
1eec0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
1eed0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
1eee0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
1eef0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1ef00 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
1ef10 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
1ef20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
1ef30 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
1ef40 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1ef50 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1ef60 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
1ef70 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
1ef80 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1ef90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1efa0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  nter */.      sq
1efb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1efc0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
1efd0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1efe0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
1eff0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
1f000 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
1f010 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
1f020 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
1f030 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
1f040 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
1f050 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
1f060 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
1f070 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1f080 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1f090 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1f0a0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
1f0b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1f0c0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
1f0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
1f0e0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
1f0f0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
1f100 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
1f110 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
1f120 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
1f130 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
1f140 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
1f150 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1f160 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1f170 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1f180 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
1f190 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65  Token;.      pDe
1f1a0 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
1f1b0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
1f1c0 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
1f1d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f1e0 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51  NABLE_UNKNOWN_SQ
1f1f0 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20  L_FUNCTION.     
1f200 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20   if( pDef==0 && 
1f210 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
1f220 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
1f230 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
1f240 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f  ction(db, "unkno
1f250 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  wn", nFarg, enc,
1f260 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
1f270 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
1f280 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78  ef==0 || pDef->x
1f290 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
1f2a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1f2b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1f2c0 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  unknown function
1f2d0 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20  : %s()", zId);. 
1f2e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f2f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1f300 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74  Attempt a direct
1f310 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1f320 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
1f330 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20  COALESCE() and. 
1f340 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29       ** IFNULL()
1f350 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
1f360 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73  s avoids unneces
1f370 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20  sary evaluation 
1f380 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
1f390 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
1f3a0 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
1f3b0 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
1f3c0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
1f3d0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
1f3e0 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
1f3f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
1f400 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
1f410 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f420 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1f430 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
1f440 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1f450 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1f460 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
1f470 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1f480 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
1f490 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
1f4a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f4b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f4c0 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
1f4d0 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
1f4e0 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
1f4f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1f500 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f510 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
1f520 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b  rse, target, 1);
1f530 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1f540 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1f550 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1f560 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1f570 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
1f580 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[i].pExpr, ta
1f590 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
1f5a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f5b0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1f5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f5d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1f5e0 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f  veLabel(v, endCo
1f5f0 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
1f600 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1f610 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e  .      /* The UN
1f620 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f  LIKELY() functio
1f630 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54  n is a no-op.  T
1f640 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
1f650 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
1f660 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  of the first arg
1f670 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
1f680 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1f690 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1f6a0 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59  TE_FUNC_UNLIKELY
1f6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1f6c0 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a  rt( nFarg>=1 );.
1f6d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1f6e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1f6f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61  rget(pParse, pFa
1f700 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
1f710 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
1f720 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
1f730 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
1f740 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
1f750 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1f760 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
1f770 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
1f780 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1f790 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20  se( i==31 );.   
1f7a0 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
1f7b0 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29   |= MASKBIT32(i)
1f7c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f7d0 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
1f7e0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1f7f0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
1f800 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
1f810 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
1f820 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f830 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
1f840 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
1f850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f860 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
1f870 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arg ){.        i
1f880 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a  f( constMask ){.
1f890 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70            r1 = p
1f8a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1f8b0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
1f8c0 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a  >nMem += nFarg;.
1f8d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f8e0 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
1f8f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1f900 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
1f910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1f920 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
1f930 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
1f940 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
1f950 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
1f960 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
1f970 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
1f980 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
1f990 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
1f9a0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
1f9b0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
1f9c0 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
1f9d0 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
1f9e0 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
1f9f0 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
1fa00 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
1fa10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1fa20 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
1fa30 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
1fa40 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f  C_LENGTH|SQLITE_
1fa50 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30  FUNC_TYPEOF))!=0
1fa60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
1fa70 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20   exprOp;.       
1fa80 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
1fa90 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
1faa0 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
1fab0 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
1fac0 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f  .          exprO
1fad0 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  p = pFarg->a[0].
1fae0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
1faf0 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d       if( exprOp=
1fb00 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78  =TK_COLUMN || ex
1fb10 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  prOp==TK_AGG_COL
1fb20 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
1fb30 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1fb40 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f  E_FUNC_LENGTH==O
1fb50 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
1fb60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
1fb70 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
1fb80 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41  NC_TYPEOF==OPFLA
1fb90 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20  G_TYPEOFARG );. 
1fba0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1fbb0 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46  ase( pDef->funcF
1fbc0 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45  lags & OPFLAG_LE
1fbd0 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
1fbe0 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b         pFarg->a[
1fbf0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20  0].pExpr->op2 = 
1fc00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fc10 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61     pDef->funcFla
1fc20 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  gs & (OPFLAG_LEN
1fc30 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
1fc40 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
1fc50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1fc60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fc70 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1fc80 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69  arse);     /* Ti
1fc90 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
1fca0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
1fcb0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1fcc0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
1fcd0 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20  rg, r1, 0,.     
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1fd00 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
1fd10 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
1fd20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1fd30 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1fd40 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63  se);      /* Tic
1fd50 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
1fd60 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
1fd70 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
1fd80 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
1fd90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1fda0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
1fdb0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
1fdc0 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
1fdd0 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
1fde0 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
1fdf0 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
1fe00 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
1fe10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
1fe20 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
1fe30 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
1fe40 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
1fe50 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
1fe60 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
1fe70 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
1fe80 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
1fe90 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
1fea0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
1feb0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
1fec0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
1fed0 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
1fee0 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
1fef0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
1ff00 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
1ff10 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
1ff20 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
1ff30 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
1ff40 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
1ff50 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
1ff60 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
1ff70 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
1ff80 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
1ff90 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
1ffa0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
1ffb0 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
1ffc0 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
1ffd0 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
1ffe0 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
1fff0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
20000 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
20010 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
20020 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
20030 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
20040 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
20050 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
20060 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
20070 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
20080 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
20090 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
200a0 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
200b0 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
200c0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
200d0 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
200e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
200f0 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
20100 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
20110 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
20120 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
20130 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
20140 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
20150 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
20160 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
20170 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
20180 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
20190 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
201a0 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
201b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
201c0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
201d0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
201e0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
201f0 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
20200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20210 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
20220 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  on0, constMask, 
20230 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
20260 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
20270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
20280 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
20290 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  Farg);.      if(
202a0 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d   nFarg && constM
202b0 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask==0 ){.      
202c0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
202d0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
202e0 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
202f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
20300 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
20310 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20320 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
20330 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
20340 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
20350 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LECT: {.      in
20360 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  t nCol;.      te
20370 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
20380 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
20390 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
203a0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
203b0 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
203c0 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78  T && (nCol = pEx
203d0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
203e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31  EList->nExpr)!=1
203f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20400 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
20410 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20  r(pParse, nCol, 
20420 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
20430 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20440 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
20450 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
20460 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  pr, 0, 0);.     
20470 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
20480 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20490 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a  K_SELECT_COLUMN:
204a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
204b0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
204c0 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d  >pLeft->iTable==
204d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
204e0 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
204f0 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  e = sqlite3CodeS
20500 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
20510 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
20520 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
20530 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
20540 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
20550 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
20560 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
20570 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
20580 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 26 26  iTable.       &&
20590 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
205a0 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  (n = sqlite3Expr
205b0 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
205c0 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20 20 20  ->pLeft)) .     
205d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
205e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
205f0 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20  se, "%d columns 
20600 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75  assigned %d valu
20610 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  es",.           
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20630 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
20640 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  le, n);.      }.
20650 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
20660 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
20670 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  e + pExpr->iColu
20680 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  mn;.    }.    ca
20690 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
206a0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
206b0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
206c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
206d0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
206e0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
206f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
20700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20710 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
20720 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
20730 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20740 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
20750 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
20760 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20780 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
20790 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
207a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
207b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
207c0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
207d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
207e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
207f0 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29  dImm, target, 0)
20800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20810 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
20820 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
20830 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
20840 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  get;.    }.#endi
20850 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
20860 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20  _SUBQUERY */... 
20870 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
20880 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
20890 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
208a0 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
208b0 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
208c0 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
208d0 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
208e0 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
208f0 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
20900 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
20910 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
20920 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
20930 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
20940 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
20950 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
20960 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
20970 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
20980 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
20990 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
209a0 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29  r, target, 0, 0)
209b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
209c0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
209d0 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20   case TK_SPAN:. 
209e0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41     case TK_COLLA
209f0 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  TE: .    case TK
20a00 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
20a10 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
20a20 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
20a30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
20a40 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
20a50 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54  }..    case TK_T
20a60 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  RIGGER: {.      
20a70 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65  /* If the opcode
20a80 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20   is TK_TRIGGER, 
20a90 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
20aa0 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e  ion is a referen
20ab0 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ce.      ** to a
20ac0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
20ad0 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73  ew.* or old.* ps
20ae0 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69  eudo-tables avai
20af0 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  lable to.      *
20b00 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
20b10 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ms. In this case
20b20 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20   Expr.iTable is 
20b30 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65  set to 1 for the
20b40 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20  .      ** new.* 
20b50 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72  pseudo-table, or
20b60 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a   0 for the old.*
20b70 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45   pseudo-table. E
20b80 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  xpr.iColumn.    
20b90 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74    ** is set to t
20ba0 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
20bb0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f   pseudo-table to
20bc0 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20   read, or to -1 
20bd0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  to.      ** read
20be0 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
20bf0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
20c00 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   ** The expressi
20c10 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
20c20 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61  d using an OP_Pa
20c30 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  ram opcode. The 
20c40 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61  p1.      ** para
20c50 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  meter is set to 
20c60 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77  0 for an old.row
20c70 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72  id reference, or
20c80 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20   to (i+1).      
20c90 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  ** to reference 
20ca0 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f  another column o
20cb0 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  f the old.* pseu
20cc0 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20  do-table, where 
20cd0 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74  .      ** i is t
20ce0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
20cf0 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65  column. For a ne
20d00 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  w.rowid referenc
20d10 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a  e, p1 is.      *
20d20 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20  * set to (n+1), 
20d30 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e  where n is the n
20d40 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
20d50 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d   in each pseudo-
20d60 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
20d70 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20  For a reference 
20d80 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c  to any other col
20d90 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
20da0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70   pseudo-table, p
20db0 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  1.      ** is se
20dc0 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68  t to (n+2+i), wh
20dd0 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20  ere n and i are 
20de0 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69  as defined previ
20df0 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20  ously. For.     
20e00 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20   ** example, if 
20e10 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69  the table on whi
20e20 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ch triggers are 
20e30 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20  being fired is. 
20e40 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64       ** declared
20e50 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
20e60 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
20e70 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
20e80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20e90 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74  * Then p1 is int
20ea0 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
20eb0 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
20ec0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20      **   p1==0  
20ed0 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64   ->    old.rowid
20ee0 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20       p1==3   -> 
20ef0 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20     new.rowid.   
20f00 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20     **   p1==1   
20f10 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20  ->    old.a     
20f20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20      p1==4   ->  
20f30 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a    new.a.      **
20f40 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20     p1==2   ->   
20f50 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70   old.b         p
20f60 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==5   ->    new
20f70 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .b       .      
20f80 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
20f90 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
20fa0 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
20fb0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
20fc0 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
20fd0 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
20fe0 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
20ff0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
21000 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
21010 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
21020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
21030 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
21040 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
21050 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
21060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
21070 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
21080 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
21090 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
210a0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
210b0 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
210c0 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
210d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
210e0 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
210f0 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
21100 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
21110 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24  ((v, "%s.%s -> $
21120 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45  %d",.        (pE
21130 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
21140 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
21150 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
21160 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
21170 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
21180 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
21190 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20  lumn].zName),.  
211a0 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20        target.   
211b0 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
211c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
211d0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
211e0 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
211f0 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
21200 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
21210 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
21220 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
21230 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
21240 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
21250 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
21260 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20  eally real..    
21270 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
21280 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39  IDENCE-OF: R-609
21290 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20  85-57662 SQLite 
212a0 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
212b0 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20   value back to. 
212c0 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
212d0 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72   point when extr
212e0 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74  acting it from t
212f0 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20  he record.  */. 
21300 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
21310 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
21320 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
21330 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
21340 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
21350 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
21360 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21370 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
21380 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
21390 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
213a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
213b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
213c0 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52    case TK_VECTOR
213d0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
213e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
213f0 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  , "row value mis
21400 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72  used");.      br
21410 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
21420 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
21430 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
21440 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
21450 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
21460 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
21470 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
21480 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
21490 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
214a0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
214b0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
214c0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
214d0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
214e0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
214f0 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
21500 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
21510 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
21520 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
21530 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
21540 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
21550 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
21560 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
21570 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
21580 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
21590 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
215a0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
215b0 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
215c0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
215d0 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
215e0 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
215f0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
21600 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
21610 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
21620 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
21630 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
21640 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
21650 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
21660 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
21670 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
21680 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
21690 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
216a0 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
216b0 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
216c0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
216d0 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
216e0 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
216f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
21700 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
21710 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
21720 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
21730 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
21740 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
21750 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
21760 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
21770 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
21780 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
21790 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
217a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
217b0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
217c0 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
217d0 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
217e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
217f0 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
21800 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
21810 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
21820 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
21850 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
21860 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
21870 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
218a0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
218b0 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
218e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
218f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
21900 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
21910 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
21920 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
21930 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21940 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
21950 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
21960 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
21970 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
21980 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
21990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
219a0 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
219b0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
219e0 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
219f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
21a00 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
21a10 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
21a20 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
21a30 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
21a40 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
21a50 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
21a60 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
21a70 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
21a80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
21a90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
21aa0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
21ab0 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
21ac0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21ad0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
21ae0 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
21af0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
21b00 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
21b10 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
21b20 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
21b30 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
21b40 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
21b50 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
21b60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
21b70 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
21b80 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
21b90 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70   ){.        temp
21ba0 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
21bb0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
21bc0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
21bd0 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65          exprToRe
21be0 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65  gister(&tempX, e
21bf0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
21c00 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
21c10 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20  egFree1));.     
21c20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
21c30 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
21c40 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f      memset(&opCo
21c50 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mpare, 0, sizeof
21c60 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20  (opCompare));.  
21c70 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
21c80 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
21c90 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
21ca0 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20  eft = &tempX;.  
21cb0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
21cc0 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
21cd0 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
21ce0 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
21cf0 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
21d00 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
21d10 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
21d20 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
21d30 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
21d40 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
21d50 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
21d60 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
21d70 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
21d80 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
21d90 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
21da0 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
21db0 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
21dc0 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
21dd0 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
21de0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
21df0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
21e00 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  r-1; i=i+2){.   
21e10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21e20 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
21e30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
21e40 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
21e50 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
21e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
21e70 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
21e80 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
21e90 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
21ea0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
21eb0 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
21ec0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
21ed0 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
21ee0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
21ef0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
21f00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21f10 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
21f20 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
21f30 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
21f40 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
21f50 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
21f60 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
21f70 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
21f80 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
21f90 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
21fa0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
21fb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21fc0 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
21fd0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
21fe0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
21ff0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
22000 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
22010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22020 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
22030 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
22040 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
22050 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
22060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22070 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30  if( (nExpr&1)!=0
22080 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22090 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
220a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
220b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
220c0 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
220d0 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
220e0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
220f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22100 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
22110 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22130 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
22140 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
22150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
22160 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
22170 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22180 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
22190 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
221a0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
221b0 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
221c0 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
221d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
221e0 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
221f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22200 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
22210 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
22220 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
22230 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
22240 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  t( pExpr->affini
22250 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  ty==OE_Rollback 
22260 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
22270 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
22280 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20  OE_Abort.       
22290 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
222a0 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a  finity==OE_Fail.
222b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
222c0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
222d0 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29  E_Ignore.      )
222e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
222f0 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
22300 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22310 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22320 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
22330 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
22340 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
22350 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
22360 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
22370 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
22380 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
22390 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
223a0 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  nity==OE_Abort )
223b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
223c0 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
223d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
223e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
223f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
22400 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
22410 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
22420 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
22430 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
22440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22450 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  p4(.            
22460 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
22470 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65  TE_OK, OE_Ignore
22480 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
22490 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  oken,0);.       
224a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
224b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
224c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
224d0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
224e0 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
224f0 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a  TRAINT_TRIGGER,.
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
22520 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
22530 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
22540 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 0);.      }..
22550 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22560 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
22570 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
22580 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
22590 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
225a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
225b0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
225c0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
225d0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63  eg;.}../*.** Fac
225e0 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65  tor out the code
225f0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
22600 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74  pression to init
22610 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
22620 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22630 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a  ExprCodeAtInit(.
22640 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
22650 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
22660 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
22670 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
22680 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
22690 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65  to code when the
226a0 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65   VDBE initialize
226b0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65  s */.  int regDe
226c0 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  st,      /* Stor
226d0 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  e the value in t
226e0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
226f0 20 20 75 38 20 72 65 75 73 61 62 6c 65 20 20 20    u8 reusable   
22700 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
22710 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
22720 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b  s reusable */.){
22730 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a  .  ExprList *p;.
22740 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46    assert( ConstF
22750 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
22760 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
22770 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70  >pConstExpr;.  p
22780 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
22790 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
227a0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70  , pExpr, 0);.  p
227b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
227c0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
227d0 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66   p, pExpr);.  if
227e0 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75  ( p ){.     stru
227f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
22800 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
22810 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  p->nExpr-1];.   
22820 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73    pItem->u.iCons
22830 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65  tExprReg = regDe
22840 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  st;.     pItem->
22850 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61  reusable = reusa
22860 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ble;.  }.  pPars
22870 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20  e->pConstExpr = 
22880 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  p;.}../*.** Gene
22890 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
228a0 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
228b0 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
228c0 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
228d0 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
228e0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
228f0 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
22900 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
22910 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
22920 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
22930 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
22940 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
22950 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
22960 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
22970 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
22980 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
22990 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
229a0 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
229b0 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
229c0 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pReg to zero..**
229d0 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
229e0 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  a constant, then
229f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
22a00 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69  ght generate thi
22a10 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c  s.** code to fil
22a20 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  l the register i
22a30 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
22a40 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20  tion section of 
22a50 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67  the.** VDBE prog
22a60 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ram, in order to
22a70 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f   factor it out o
22a80 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  f the evaluation
22a90 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
22aa0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
22ab0 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
22ac0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
22ad0 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
22ae0 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r2;.  pExpr = sq
22af0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
22b00 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
22b10 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
22b20 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70  (pParse).   && p
22b30 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
22b40 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69  ISTER.   && sqli
22b50 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
22b60 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a  tNotJoin(pExpr).
22b70 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73    ){.    ExprLis
22b80 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  t *p = pParse->p
22b90 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69  ConstExpr;.    i
22ba0 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20  nt i;.    *pReg 
22bb0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20   = 0;.    if( p 
22bc0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
22bd0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
22be0 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
22bf0 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
22c00 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
22c10 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
22c20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72      if( pItem->r
22c30 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74  eusable && sqlit
22c40 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
22c50 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
22c60 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
22c70 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65       return pIte
22c80 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
22c90 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  eg;.        }.  
22ca0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22cb0 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r2 = ++pParse->n
22cc0 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
22cd0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
22ce0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32  Parse, pExpr, r2
22cf0 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
22d00 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
22d10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
22d20 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
22d30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
22d40 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
22d50 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66  xpr, r1);.    if
22d60 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20  ( r2==r1 ){.    
22d70 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
22d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
22d90 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22da0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
22db0 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  ;.      *pReg = 
22dc0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
22dd0 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
22de0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
22df0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
22e00 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
22e10 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
22e20 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
22e30 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
22e40 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
22e50 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
22e60 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
22e70 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
22e80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
22e90 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
22ea0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
22eb0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
22ec0 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
22ed0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
22ee0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
22ef0 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
22f00 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72  ( pExpr && pExpr
22f10 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
22f20 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  R ){.    sqlite3
22f30 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
22f40 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70  e->pVdbe, OP_Cop
22f50 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  y, pExpr->iTable
22f60 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
22f70 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20  se{.    inReg = 
22f80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
22f90 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
22fa0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
22fb0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22fc0 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50  ->pVdbe!=0 || pP
22fd0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
22fe0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
22ff0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
23000 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
23010 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23020 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
23030 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
23040 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
23050 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  et);.    }.  }.}
23060 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  ../*.** Make a t
23070 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66  ransient copy of
23080 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
23090 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20  r and then code 
230a0 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  it using.** sqli
230b0 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20  te3ExprCode().  
230c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
230d0 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c  ks just like sql
230e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a  ite3ExprCode().*
230f0 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  * except that th
23100 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69  e input expressi
23110 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  on is guaranteed
23120 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64   to be unchanged
23130 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23140 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61  3ExprCodeCopy(Pa
23150 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
23160 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
23170 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  rget){.  sqlite3
23180 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23190 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  b;.  pExpr = sql
231a0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
231b0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
231c0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
231d0 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  ed ) sqlite3Expr
231e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
231f0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73  pr, target);.  s
23200 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
23210 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (db, pExpr);.}..
23220 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23230 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
23240 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
23250 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
23260 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
23270 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
23280 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
23290 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
232a0 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
232b0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
232c0 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
232d0 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
232e0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
232f0 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f  ine.** might cho
23300 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20  ose to code the 
23310 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e  expression at in
23320 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
23330 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
23340 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72  e3ExprCodeFactor
23350 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
23360 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
23370 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
23380 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f  if( pParse->okCo
23390 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c  nstFactor && sql
233a0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
233b0 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
233c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
233d0 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
233e0 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29  Expr, target, 0)
233f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
23400 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
23410 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
23420 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rget);.  }.}../*
23430 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
23440 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73  e that evaluates
23450 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
23460 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74  ssion and puts t
23470 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  he result.** in 
23480 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
23490 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65  .**.** Also make
234a0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
234b0 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74  xpression result
234c0 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22  s into another "
234d0 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a  cache" register.
234e0 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  ** and modify th
234f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
23500 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69  that the next ti
23510 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  me it is evaluat
23520 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ed,.** the resul
23530 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  t is a copy of t
23540 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65  he cache registe
23550 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
23560 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
23570 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  r expressions th
23580 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74  at are used mult
23590 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20  iple .** times. 
235a0 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61   They are evalua
235b0 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65  ted once and the
235c0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
235d0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72  expression.** ar
235e0 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69  e reused..*/.voi
235f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
23600 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
23610 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
23620 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
23630 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
23640 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
23650 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73  int iMem;..  ass
23660 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
23670 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
23680 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
23690 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  R );.  sqlite3Ex
236a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
236b0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
236c0 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
236d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
236e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
236f0 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20  P_Copy, target, 
23700 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52  iMem);.  exprToR
23710 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69  egister(pExpr, i
23720 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mem);.}../*.** G
23730 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
23740 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
23750 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
23760 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
23770 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
23780 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
23790 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
237a0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
237b0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
237c0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
237d0 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
237e0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ted..**.** The S
237f0 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66  QLITE_ECEL_DUP f
23800 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65  lag prevents the
23810 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
23820 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20  being.** filled 
23830 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20  using OP_SCopy. 
23840 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65   OP_Copy must be
23850 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
23860 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
23870 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75  ECEL_FACTOR argu
23880 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73  ment allows cons
23890 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74  tant arguments t
238a0 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64  o be.** factored
238b0 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61   out into initia
238c0 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a  lization code..*
238d0 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
238e0 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65  ECEL_REF flag me
238f0 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73  ans that express
23900 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ions in the list
23910 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73   with.** ExprLis
23920 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  t.a[].u.x.iOrder
23930 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72  ByCol>0 have alr
23940 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61  eady been evalua
23950 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a  ted and stored.*
23960 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61  * in registers a
23970 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f  t srcReg, and so
23980 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62   the value can b
23990 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
239a0 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ere..*/.int sqli
239b0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
239c0 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
239d0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
239e0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
239f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
23a00 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
23a10 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
23a20 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
23a30 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
23a40 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
23a50 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
23a60 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20  nt srcReg,      
23a70 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69    /* Source regi
23a80 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f  sters if SQLITE_
23a90 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38  ECEL_REF */.  u8
23aa0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
23ab0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   /* SQLITE_ECEL_
23ac0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
23ad0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23ae0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
23af0 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38  nt i, j, n;.  u8
23b00 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73   copyOp = (flags
23b10 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   & SQLITE_ECEL_D
23b20 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20  UP) ? OP_Copy : 
23b30 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65  OP_SCopy;.  Vdbe
23b40 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
23b50 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dbe;.  assert( p
23b60 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
23b70 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
23b80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
23b90 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
23ba0 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
23bb0 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
23bc0 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
23bd0 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43  >nExpr;.  if( !C
23be0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
23bf0 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20  rse) ) flags &= 
23c00 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  ~SQLITE_ECEL_FAC
23c10 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  TOR;.  for(pItem
23c20 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
23c30 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
23c40 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
23c50 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
23c60 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  pr;.    if( (fla
23c70 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
23c80 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d  _REF)!=0 && (j =
23c90 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
23ca0 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20  erByCol)>0 ){.  
23cb0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
23cc0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
23cd0 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69  REF ){.        i
23ce0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b  --;.        n--;
23cf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23d10 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
23d20 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74  p, j+srcReg-1, t
23d30 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
23d40 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
23d50 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23d60 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20  ECEL_FACTOR)!=0 
23d70 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
23d80 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20  Constant(pExpr) 
23d90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23da0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
23db0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
23dc0 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20  rget+i, 0);.    
23dd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
23de0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
23df0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
23e00 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
23e10 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69  rget+i);.      i
23e20 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
23e30 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64  +i ){.        Vd
23e40 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
23e50 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f     if( copyOp==O
23e60 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
23e70 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56  && (pOp=sqlite3V
23e80 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29  dbeGetOp(v, -1))
23e90 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70  ->opcode==OP_Cop
23ea0 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  y.         && pO
23eb0 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p1+pOp->p3+1=
23ec0 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  =inReg.         
23ed0 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
23ee0 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20  p3+1==target+i. 
23ef0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
23f00 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20      pOp->p3++;. 
23f10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23f30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
23f40 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  yOp, inReg, targ
23f50 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  et+i);.        }
23f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23f70 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
23f80 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23f90 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57   code for a BETW
23fa0 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  EEN operator..**
23fb0 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e  .**    x BETWEEN
23fc0 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54   y AND z.**.** T
23fd0 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69  he above is equi
23fe0 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a  valent to .**.**
23ff0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
24000 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20  z.**.** Code it 
24010 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
24020 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
24030 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
24040 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69  ion.** eliminati
24050 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54  on of x..**.** T
24060 68 65 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d  he xJumpIf param
24070 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
24080 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20  details:.**.**  
24090 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20    NULL:         
240a0 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
240b0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
240c0 6c 74 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a  lt in reg[dest].
240d0 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  **    sqlite3Exp
240e0 72 49 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75  rIfTrue:      Ju
240f0 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 74 72  mp to dest if tr
24100 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  ue.**    sqlite3
24110 45 78 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20  ExprIfFalse:    
24120 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
24130 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65   false.**.** The
24140 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61   jumpIfNull para
24150 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
24160 20 69 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e   if xJumpIf is N
24170 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
24180 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77  oid exprCodeBetw
24190 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  een(.  Parse *pP
241a0 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
241b0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
241c0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
241d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
241e0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45  ,      /* The BE
241f0 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e  TWEEN expression
24200 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
24210 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
24220 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73  destination or s
24230 74 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20  torage location 
24240 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d  */.  void (*xJum
24250 70 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c  p)(Parse*,Expr*,
24260 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74  int,int), /* Act
24270 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20  ion to take */. 
24280 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
24290 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
242a0 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
242b0 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  EN is NULL */.){
242c0 0a 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20  . Expr exprAnd; 
242d0 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f      /* The AND o
242e0 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79  perator in  x>=y
242f0 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20   AND x<=z  */.  
24300 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20  Expr compLeft;  
24310 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20    /* The  x>=y  
24320 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63  term */.  Expr c
24330 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54  ompRight;   /* T
24340 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a  he  x<=z  term *
24350 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20  /.  Expr exprX; 
24360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20        /* The  x 
24370 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
24380 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
24390 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61   = 0; /* Tempora
243a0 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
243b0 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63  */...  memset(&c
243c0 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65  ompLeft, 0, size
243d0 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d  of(Expr));.  mem
243e0 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20  set(&compRight, 
243f0 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
24400 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72  ;.  memset(&expr
24410 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  And, 0, sizeof(E
24420 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  xpr));..  assert
24430 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
24440 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
24450 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70  Select) );.  exp
24460 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
24470 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70  ft;.  exprAnd.op
24480 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70   = TK_AND;.  exp
24490 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
244a0 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  mpLeft;.  exprAn
244b0 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
244c0 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66  Right;.  compLef
244d0 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
244e0 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
244f0 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c   &exprX;.  compL
24500 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
24510 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
24520 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52  ].pExpr;.  compR
24530 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
24540 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65  .  compRight.pLe
24550 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
24560 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
24570 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
24580 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
24590 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
245a0 65 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56  exprX, exprCodeV
245b0 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65  ector(pParse, &e
245c0 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
245d0 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29  );.  if( xJump )
245e0 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72  {.    xJump(pPar
245f0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
24600 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
24610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
24620 20 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73   Mark the expres
24630 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72  sion is being fr
24640 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
24650 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  NG clause of a j
24660 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68  oin.    ** so th
24670 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 45 78  at the sqlite3Ex
24680 70 72 43 6f 64 65 54 61 72 67 65 74 28 29 20 72  prCodeTarget() r
24690 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
246a0 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a  attempt to move.
246b0 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74      ** it into t
246c0 68 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45  he Parse.pConstE
246d0 78 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68  xpr list.  We sh
246e0 6f 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62  ould use a new b
246f0 69 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20  it for this,.   
24700 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c   ** for clarity,
24710 20 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20   but we are out 
24720 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45  of bits in the E
24730 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20  xpr.flags field 
24740 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76  so we.    ** hav
24750 65 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 45  e to reuse the E
24760 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20  P_FromJoin bit. 
24770 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20   Bummer. */.    
24780 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45  exprX.flags |= E
24790 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20  P_FromJoin;.    
247a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
247b0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65  arget(pParse, &e
247c0 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20  xprAnd, dest);. 
247d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
247e0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
247f0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20  e, regFree1);.. 
24800 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75   /* Ensure adequ
24810 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67  ate test coverag
24820 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  e */.  testcase(
24830 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
24840 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
24850 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
24860 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
24870 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
24880 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
24890 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
248a0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
248b0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
248c0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
248d0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
248e0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
248f0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
24900 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
24910 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
24920 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
24930 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
24940 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
24950 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
24960 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
24970 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
24980 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
24990 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
249a0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
249b0 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
249c0 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
249d0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
249e0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
249f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24a00 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
24a10 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
24a20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24a30 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
24a40 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
24a50 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
24a60 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
24a70 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24a80 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  0 );.}../*.** Ge
24a90 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
24aa0 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
24ab0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
24ac0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
24ad0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
24ae0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
24af0 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
24b00 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
24b10 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
24b20 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
24b30 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
24b40 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
24b50 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
24b60 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
24b70 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
24b80 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
24b90 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
24ba0 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
24bb0 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
24bc0 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
24bd0 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
24be0 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
24bf0 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
24c00 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
24c10 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
24c20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
24c30 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
24c40 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
24c50 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
24c60 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
24c70 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
24c80 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
24c90 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
24ca0 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
24cb0 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
24cc0 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
24cd0 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
24ce0 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
24cf0 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
24d00 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
24d10 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
24d20 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
24d30 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24d40 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
24d50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
24d60 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
24d70 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
24d80 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
24d90 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
24da0 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
24db0 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
24dc0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
24dd0 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
24de0 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
24df0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
24e00 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
24e10 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
24e20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20  NEVER(v==0) )   
24e30 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78    return;  /* Ex
24e40 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
24e50 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
24e60 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  r */.  if( NEVER
24e70 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74  (pExpr==0) ) ret
24e80 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20  urn;  /* No way 
24e90 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
24ea0 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  */.  op = pExpr-
24eb0 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
24ec0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
24ed0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
24ee0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
24ef0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
24f00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24f10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
24f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24f30 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
24f40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
24f50 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
24f60 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
24f70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24f80 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
24f90 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
24fa0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
24fb0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
24fc0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
24fd0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
24fe0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
24ff0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
25000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25010 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
25020 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25030 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
25040 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
25050 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
25060 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
25070 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
25080 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
25090 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
250a0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
250b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
250c0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
250d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
250e0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
250f0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
25100 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25110 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25120 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
25130 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25140 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
25150 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
25160 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25170 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
25180 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25190 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
251a0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
251b0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
251c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
251d0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
251e0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
251f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25200 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
25210 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
25220 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
25230 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
25240 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
25250 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49  _NE;.      jumpI
25260 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e  fNull = SQLITE_N
25270 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
25280 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
25290 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
252a0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
252b0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
252c0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
252d0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
252e0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
252f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25300 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78  ExprIsVector(pEx
25310 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74  pr->pLeft) ) got
25320 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a  o default_expr;.
25330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25340 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
25350 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
25360 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
25370 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25380 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
25390 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
253a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
253b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
253c0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
253d0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
253e0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
253f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
25400 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25420 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
25430 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
25440 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
25450 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
25460 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
25470 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
25480 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
25490 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
254a0 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
254b0 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
254c0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
254d0 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
254e0 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
254f0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
25500 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
25510 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
25520 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
25530 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
25540 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
25550 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
25560 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
25570 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
25580 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
25590 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
255a0 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Eq);.      VdbeC
255b0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
255c0 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
255d0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
255e0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
255f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
25600 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
25610 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
25620 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73  LLEQ);.      ass
25630 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
25640 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
25650 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ne);.      Vd
25660 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
25670 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
25680 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
25690 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
256a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
256b0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
256c0 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
256d0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
256e0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
256f0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
25700 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
25710 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
25720 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
25730 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
25740 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
25750 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
25760 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
25770 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
25780 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
25790 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
257a0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
257b0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
257c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
257d0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
257e0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
257f0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
25800 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25810 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
25820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25830 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
25840 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64   dest);.      Vd
25850 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
25860 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
25870 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
25880 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
25890 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
258a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
258b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
258c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
258d0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
258e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
258f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
25900 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
25910 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
25920 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71   pExpr, dest, sq
25930 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 2c  lite3ExprIfTrue,
25940 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25960 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25970 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
25980 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
25990 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
259a0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
259b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
259c0 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
259d0 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75  fNull = jumpIfNu
259e0 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74  ll ? dest : dest
259f0 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73  IfFalse;.      s
25a00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
25a10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
25a20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
25a30 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
25a40 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
25a50 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
25a60 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
25a70 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
25a80 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62  fFalse);.      b
25a90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
25aa0 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
25ab0 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
25ac0 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78  pr:.      if( ex
25ad0 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
25ae0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
25af0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
25b00 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
25b10 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
25b20 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
25b30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
25b40 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
25b50 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
25b60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25b70 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
25b80 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
25b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25ba0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
25bb0 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  If, r1, dest, ju
25bc0 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
25bd0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
25be0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
25bf0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
25c00 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
25c10 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
25c20 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
25c30 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
25c40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
25c50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
25c60 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
25c70 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
25c80 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
25c90 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
25ca0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
25cb0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
25cc0 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
25cd0 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
25ce0 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
25cf0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
25d00 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
25d10 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
25d20 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
25d30 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
25d40 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
25d50 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
25d60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
25d70 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
25d80 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
25d90 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
25da0 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
25db0 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
25dc0 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
25dd0 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
25de0 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
25df0 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
25e00 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
25e10 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
25e20 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
25e30 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
25e40 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
25e50 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
25e60 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
25e70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
25e80 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
25e90 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
25ea0 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
25eb0 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
25ec0 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
25ed0 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
25ee0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
25ef0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
25f00 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63  urn; /* Existenc
25f10 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
25f20 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
25f30 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
25f40 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a     return;..  /*
25f50 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
25f60 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
25f70 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
25f80 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
25f90 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
25fb0 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
25fc0 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
25fd0 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
25fe0 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
25ff0 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
26000 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
26010 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
26020 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
26030 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
26040 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
26050 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
26060 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
26070 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
26080 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
26090 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
260a0 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
260b0 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
260c0 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
260d0 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
260e0 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
260f0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
26100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
26110 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
26120 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
26130 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
26140 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
26150 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
26160 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
26170 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
26180 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
26190 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
261a0 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
261b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
261c0 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
261d0 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
261e0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
261f0 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
26200 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
26210 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
26220 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
26230 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
26240 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
26250 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
26260 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
26270 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
26280 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
26290 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
262a0 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
262b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
262c0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
262d0 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
262e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
262f0 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
26300 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
26310 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
26320 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
26330 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
26340 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
26350 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
26360 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
26370 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
26380 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
26390 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
263a0 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
263b0 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
263c0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
263d0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
263e0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
263f0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
26400 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
26410 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26420 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26430 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26440 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
26450 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
26460 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26470 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26480 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
26490 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
264a0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
264b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
264c0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
264d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
264e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
264f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
26500 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
26510 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
26520 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
26530 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
26540 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
26550 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26560 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
26570 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
26580 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26590 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
265a0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
265b0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
265c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
265d0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
265e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
265f0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
26600 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
26610 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26620 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26630 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
26640 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
26650 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
26660 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
26670 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26680 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
26690 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
266a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
266b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
266c0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
266d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
266e0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
266f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26700 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
26710 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
26720 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73  ISNOT:.      tes
26730 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
26740 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
26750 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
26760 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
26770 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45  ;.      op = (pE
26780 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20  xpr->op==TK_IS) 
26790 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b  ? TK_NE : TK_EQ;
267a0 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c  .      jumpIfNul
267b0 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  l = SQLITE_NULLE
267c0 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  Q;.      /* Fall
267d0 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
267e0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
267f0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
26800 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
26810 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
26820 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
26830 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
26840 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
26850 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e  IsVector(pExpr->
26860 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65  pLeft) ) goto de
26870 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20  fault_expr;.    
26880 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26890 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
268a0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
268b0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
268c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
268d0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
268e0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
268f0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
26900 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
26910 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
26920 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
26930 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26940 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
26950 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
26960 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
26970 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
26980 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
26990 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
269a0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
269b0 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
269c0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
269d0 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
269e0 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
269f0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26a00 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
26a10 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
26a20 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
26a30 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
26a40 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26a50 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
26a60 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
26a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26a80 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
26a90 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
26aa0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26ab0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
26ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26ad0 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
26ae0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
26af0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
26b00 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
26b10 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
26b20 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
26b30 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
26b40 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
26b50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
26b60 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
26b70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26b80 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
26b90 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
26ba0 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
26bb0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26bc0 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
26bd0 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
26be0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
26bf0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26c00 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
26c10 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
26c20 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
26c30 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26c40 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
26c50 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
26c60 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
26c70 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26c80 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
26c90 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
26ca0 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
26cb0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
26cc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26cd0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
26ce0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26cf0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
26d00 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
26d10 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26d20 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20  =TK_ISNULL );   
26d30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26d40 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
26d50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26d60 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
26d70 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
26d80 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
26d90 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
26da0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
26db0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
26dc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26dd0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
26de0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26df0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26e00 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
26e10 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
26e20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c  pExpr, dest, sql
26e30 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c  ite3ExprIfFalse,
26e40 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26e50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26e60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26e70 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
26e80 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
26e90 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
26ea0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
26eb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
26ec0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
26ed0 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
26ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26ef0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
26f00 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
26f10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
26f20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26f30 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
26f40 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
26f50 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
26f60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
26f70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
26f80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
26f90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26fa0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
26fb0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
26fc0 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20  fault_expr: .   
26fd0 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
26fe0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
26ff0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27000 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
27010 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
27020 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
27030 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
27040 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
27050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27060 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
27070 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
27080 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
27090 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
270a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
270b0 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
270c0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
270d0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
270e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
270f0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
27100 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
27110 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
27120 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27130 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
27140 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27150 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
27160 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
27170 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
27180 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
27190 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
271a0 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f   regFree2);.}../
271b0 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65  *.** Like sqlite
271c0 33 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65  3ExprIfFalse() e
271d0 78 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70  xcept that a cop
271e0 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78  y is made of pEx
271f0 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64  pr before.** cod
27200 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e  e generation, an
27210 64 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64  d that copy is d
27220 65 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64  eleted after cod
27230 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68  e generation. Th
27240 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68  is.** ensures th
27250 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
27260 70 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67  pExpr is unchang
27270 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
27280 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75  te3ExprIfFalseDu
27290 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
272a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
272b0 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49  t dest,int jumpI
272c0 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65  fNull){.  sqlite
272d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
272e0 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70  db;.  Expr *pCop
272f0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  y = sqlite3ExprD
27300 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
27310 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
27320 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
27330 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27340 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43  False(pParse, pC
27350 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  opy, dest, jumpI
27360 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  fNull);.  }.  sq
27370 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
27380 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 0a  db, pCopy);.}...
27390 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
273a0 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
273b0 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
273c0 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  es.  Return 0 if
273d0 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
273e0 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70  essions are comp
273f0 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c  letely identical
27400 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
27410 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a  hey differ only.
27420 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ** by a COLLATE 
27430 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20  operator at the 
27440 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75  top level.  Retu
27450 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72  rn 2 if there ar
27460 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a  e differences.**
27470 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
27480 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54  top-level COLLAT
27490 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  E operator..**.*
274a0 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d  * If any subelem
274b0 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78  ent of pB has Ex
274c0 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20  pr.iTable==(-1) 
274d0 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77  then it is allow
274e0 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65  ed.** to compare
274f0 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75   equal to an equ
27500 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20  ivalent element 
27510 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e  in pA with Expr.
27520 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a  iTable==iTab..**
27530 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65 20  .** The pA side 
27540 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 54  might be using T
27550 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66 20  K_REGISTER.  If 
27560 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
27570 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f   and pB is.** no
27580 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  t using TK_REGIS
27590 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65 72  TER but is other
275a0 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c  wise equivalent,
275b0 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
275c0 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rn 0..**.** Some
275d0 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69  times this routi
275e0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32  ne will return 2
275f0 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
27600 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
27610 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
27620 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
27630 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
27640 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
27650 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
27660 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75  , we return 2 ju
27670 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20  st to be safe.  
27680 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
27690 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c  ne.** returns 2,
276a0 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
276b0 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
276c0 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
276d0 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
276e0 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
276f0 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
27700 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e   a 0 or 1 return
27710 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61  , then you.** ca
27720 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78  n be sure the ex
27730 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
27740 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20  e same.  In the 
27750 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20  places where.** 
27760 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
27770 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f  used, it does no
27780 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e  t hurt to get an
27790 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a   extra 2 - that.
277a0 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
277b0 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
277c0 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
277d0 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
277e0 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
277f0 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c  t 0 or 1 could l
27800 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
27810 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
27820 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
27830 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
27840 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
27850 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61   u32 combinedFla
27860 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20  gs;.  if( pA==0 
27870 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  || pB==0 ){.    
27880 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20  return pB==pA ? 
27890 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d  0 : 2;.  }.  com
278a0 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d  binedFlags = pA-
278b0 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61  >flags | pB->fla
278c0 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e  gs;.  if( combin
278d0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  edFlags & EP_Int
278e0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28  Value ){.    if(
278f0 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e   (pA->flags&pB->
27900 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75  flags&EP_IntValu
27910 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69  e)!=0 && pA->u.i
27920 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61  Value==pB->u.iVa
27930 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  lue ){.      ret
27940 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
27950 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
27960 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
27970 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >op ){.    if( p
27980 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
27990 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  E && sqlite3Expr
279a0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
279b0 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20 29  t, pB, iTab)<2 )
279c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
279d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
279e0 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pB->op==TK_COLLA
279f0 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
27a00 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42 2d  rCompare(pA, pB-
27a10 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32 20  >pLeft, iTab)<2 
27a20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27a30 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
27a40 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
27a50 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
27a60 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  MN && pA->op!=TK
27a70 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  _AGG_COLUMN && p
27a80 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
27a90 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
27aa0 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
27ab0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
27ac0 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  trICmp(pA->u.zTo
27ad0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
27ae0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
27af0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
27b00 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  trcmp(pA->u.zTok
27b10 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
27b20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
27b30 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43  urn pA->op==TK_C
27b40 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a  OLLATE ? 1 : 2;.
27b50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
27b60 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
27b70 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
27b80 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
27b90 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
27ba0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63  .  if( ALWAYS((c
27bb0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
27bc0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29  P_TokenOnly)==0)
27bd0 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62   ){.    if( comb
27be0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78  inedFlags & EP_x
27bf0 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  IsSelect ) retur
27c00 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
27c10 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
27c20 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
27c30 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65  Left, iTab) ) re
27c40 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
27c50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
27c60 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
27c70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  B->pRight, iTab)
27c80 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
27c90 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
27ca0 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ListCompare(pA->
27cb0 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70  x.pList, pB->x.p
27cc0 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65  List, iTab) ) re
27cd0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
27ce0 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
27cf0 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63  Flags & EP_Reduc
27d00 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f  ed)==0) && pA->o
27d10 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p!=TK_STRING ){.
27d20 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43        if( pA->iC
27d30 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
27d40 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  mn ) return 2;. 
27d50 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61       if( pA->iTa
27d60 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
27d70 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e  .       && (pA->
27d80 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
27d90 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65  NEVER(pB->iTable
27da0 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32  >=0)) ) return 2
27db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
27dc0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
27dd0 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70   Compare two Exp
27de0 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20  rList objects.  
27df0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79  Return 0 if they
27e00 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
27e10 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  nd .** non-zero 
27e20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
27e30 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
27e40 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
27e50 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
27e60 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
27e70 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
27e80 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
27e90 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
27ea0 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
27eb0 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
27ec0 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
27ed0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27ee0 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e  might return non
27ef0 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61  -zero for equiva
27f00 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20  lent ExprLists. 
27f10 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e   The.** only con
27f20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65  sequence will be
27f30 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69   disabled optimi
27f40 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  zations.  But th
27f50 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  is routine.** mu
27f60 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20  st never return 
27f70 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70  0 if the two Exp
27f80 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72  rList objects ar
27f90 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a  e different, or.
27fa0 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ** a malfunction
27fb0 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a   will result..**
27fc0 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69  .** Two NULL poi
27fd0 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64  nters are consid
27fe0 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73  ered to be the s
27ff0 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c  ame.  But a NULL
28000 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61   pointer.** alwa
28010 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  ys differs from 
28020 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
28030 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
28040 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
28050 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20  e(ExprList *pA, 
28060 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e  ExprList *pB, in
28070 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69  t iTab){.  int i
28080 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26  ;.  if( pA==0 &&
28090 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
280a0 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  0;.  if( pA==0 |
280b0 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  | pB==0 ) return
280c0 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45   1;.  if( pA->nE
280d0 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29  xpr!=pB->nExpr )
280e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
280f0 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70  (i=0; i<pA->nExp
28100 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
28110 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e  r *pExprA = pA->
28120 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
28130 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70  Expr *pExprB = p
28140 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  B->a[i].pExpr;. 
28150 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e     if( pA->a[i].
28160 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61  sortOrder!=pB->a
28170 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
28180 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
28190 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
281a0 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78  pare(pExprA, pEx
281b0 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
281c0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
281d0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
281e0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
281f0 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20  e can prove the 
28200 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  pE2 will always 
28210 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69  be true if pE1 i
28220 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75  s.** true.  Retu
28230 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63  rn false if we c
28240 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74  annot complete t
28250 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70  he proof or if p
28260 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66  E2 might.** be f
28270 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a  alse.  Examples:
28280 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  .**.**     pE1: 
28290 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20  x==5       pE2: 
282a0 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
282b0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
282c0 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20       pE1: x>0   
282d0 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
282e0 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
282f0 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
28300 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20  pE1: x=21       
28310 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34  pE2: x=21 OR y=4
28320 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  3     Result: tr
28330 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
28340 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78  !=123     pE2: x
28350 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
28360 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
28370 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20      pE1: x!=?1  
28380 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
28390 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
283a0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
283b0 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45  1: x IS NULL  pE
283c0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
283d0 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
283e0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
283f0 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20  IS ?2    pE2: x 
28400 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
28410 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a  euslt: false.**.
28420 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  ** When comparin
28430 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  g TK_COLUMN node
28440 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e  s between pE1 an
28450 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61  d pE2, if pE2 ha
28460 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65  s.** Expr.iTable
28470 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  <0 then assume a
28480 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69   table number gi
28490 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a  ven by iTab..**.
284a0 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
284b0 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
284c0 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
284d0 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
284e0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
284f0 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
28500 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
28510 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
28520 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
28530 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
28540 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
28550 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
28560 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
28570 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
28580 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
28590 45 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20  Expr(Expr *pE1, 
285a0 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69  Expr *pE2, int i
285b0 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Tab){.  if( sqli
285c0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
285d0 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d  E1, pE2, iTab)==
285e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
285f0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
28600 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26  ->op==TK_OR.   &
28610 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d  & (sqlite3ExprIm
28620 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
28630 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
28640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
28650 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
28660 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32  iesExpr(pE1, pE2
28670 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
28680 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
28690 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
286a0 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  E2->op==TK_NOTNU
286b0 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54  LL && pE1->op!=T
286c0 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
286d0 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20  >op!=TK_IS ){.  
286e0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c    Expr *pX = sql
286f0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
28700 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b  ate(pE1->pLeft);
28710 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
28720 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b  X!=pE1->pLeft );
28730 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
28740 45 78 70 72 43 6f 6d 70 61 72 65 28 70 58 2c 20  ExprCompare(pX, 
28750 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
28760 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
28770 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
28780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
28790 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
287a0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
287b0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
287c0 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
287d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
287e0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  n expression can
287f0 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 62 79   be evaluated by
28800 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
28810 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c  e.** index only,
28820 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
28830 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20 66  to do a search f
28840 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
28850 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e  ding.** table en
28860 74 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76  try.  The IdxCov
28870 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73  er.pIdx field is
28880 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78   the index.  Idx
28890 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73  Cover.iCur.** is
288a0 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
288b0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
288c0 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a  ruct IdxCover {.
288d0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
288e0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
288f0 74 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f 72  to be tested for
28900 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69   coverage */.  i
28910 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
28920 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
28930 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63   for the table c
28940 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
28950 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a  the index */.};.
28960 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
28970 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
28980 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
28990 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
289a0 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  .** pWalker->u.p
289b0 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63  IdxCover->iCur c
289c0 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 20  an be satisfied 
289d0 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a  using the index.
289e0 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ** pWalker->u.pI
289f0 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a  dxCover->pIdx..*
28a00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
28a10 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72  rIdxCover(Walker
28a20 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
28a30 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
28a40 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
28a50 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
28a60 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72  >iTable==pWalker
28a70 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69  ->u.pIdxCover->i
28a80 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65  Cur.   && sqlite
28a90 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
28aa0 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
28ab0 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72  ver->pIdx, pExpr
28ac0 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29  ->iColumn)<0.  )
28ad0 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
28ae0 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65  Code = 1;.    re
28af0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28b00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
28b10 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
28b20 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
28b30 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f   an index pIdx o
28b40 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  n table with cur
28b50 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e  sor iCur contain
28b60 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78  s will.** the ex
28b70 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
28b80 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
28b90 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63  the index does c
28ba0 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72  over the.** expr
28bb0 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65  ession and false
28bc0 20 69 66 20 74 68 65 20 70 45 78 70 72 20 65 78   if the pExpr ex
28bd0 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e  pression referen
28be0 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ces table column
28bf0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f  s.** that are no
28c00 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69  t found in the i
28c10 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
28c20 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69   An index coveri
28c30 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
28c40 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
28c50 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
28c60 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75  e.** evaluated u
28c70 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e  sing only the in
28c80 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20  dex and without 
28c90 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70  having to lookup
28ca0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
28cb0 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72  nding table entr
28cc0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
28cd0 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e  3ExprCoveredByIn
28ce0 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78  dex(.  Expr *pEx
28cf0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  pr,        /* Th
28d00 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65  e index to be te
28d10 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sted */.  int iC
28d20 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ur,           /*
28d30 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   The cursor numb
28d40 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  er for the corre
28d50 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a  sponding table *
28d60 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
28d70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
28d80 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68 74 20  ndex that might 
28d90 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65  be used for cove
28da0 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c  rage */.){.  Wal
28db0 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
28dc0 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20  IdxCover xcov;. 
28dd0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
28de0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f  izeof(w));.  xco
28df0 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  v.iCur = iCur;. 
28e00 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64   xcov.pIdx = pId
28e10 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  x;.  w.xExprCall
28e20 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f  back = exprIdxCo
28e30 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43  ver;.  w.u.pIdxC
28e40 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20  over = &xcov;.  
28e50 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
28e60 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65  &w, pExpr);.  re
28e70 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d  turn !w.eCode;.}
28e80 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  .../*.** An inst
28e90 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
28ea0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
28eb0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
28ec0 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
28ed0 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65   count reference
28ee0 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d  s to table colum
28ef0 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ns in the argume
28f00 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67  nts of an .** ag
28f10 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
28f20 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  , in order to im
28f30 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73  plement the.** s
28f40 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68  qlite3FunctionTh
28f50 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e  isSrc() routine.
28f60 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f  .*/.struct SrcCo
28f70 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20  unt {.  SrcList 
28f80 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20  *pSrc;   /* One 
28f90 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20  particular FROM 
28fa0 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74  clause in a nest
28fb0 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ed query */.  in
28fc0 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f  t nThis;       /
28fd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
28fe0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
28ff0 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f  s in pSrcList */
29000 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20  .  int nOther;  
29010 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29020 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
29030 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20  olumns in other 
29040 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a  FROM clauses */.
29050 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  };../*.** Count 
29060 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
29070 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
29080 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mns..*/.static i
29090 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28  nt exprSrcCount(
290a0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
290b0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
290c0 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20   /* The NEVER() 
290d0 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65  on the second te
290e0 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71  rm is because sq
290f0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
29100 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20  sThisSrc().  ** 
29110 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64  is always called
29120 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45   before sqlite3E
29130 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
29140 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68  ates() and so th
29150 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e  e.  ** TK_COLUMN
29160 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  s have not yet b
29170 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  een converted in
29180 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
29190 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74  .  If.  ** sqlit
291a0 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
291b0 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20  isSrc() is used 
291c0 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74  differently in t
291d0 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20  he future, the. 
291e0 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c   ** NEVER() will
291f0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f   need to be remo
29200 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45  ved. */.  if( pE
29210 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
29220 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70  MN || NEVER(pExp
29230 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
29240 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74  LUMN) ){.    int
29250 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   i;.    struct S
29260 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61  rcCount *p = pWa
29270 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e  lker->u.pSrcCoun
29280 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
29290 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
292a0 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70      int nSrc = p
292b0 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63  Src ? pSrc->nSrc
292c0 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
292d0 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
292e0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
292f0 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
29300 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62  a[i].iCursor ) b
29310 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
29320 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20  if( i<nSrc ){.  
29330 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a      p->nThis++;.
29340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29350 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20   p->nOther++;.  
29360 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29370 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
29380 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
29390 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
293a0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
293b0 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20   pExpr Function 
293c0 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72  reference.** pSr
293d0 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74  cList.  Return t
293e0 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20  rue if they do. 
293f0 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
29400 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e if the functio
29410 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75  n.** has no argu
29420 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c  ments or has onl
29430 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  y constant argum
29440 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61  ents.  Return fa
29450 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20  lse if pExpr.** 
29460 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d  references colum
29470 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d  ns but not colum
29480 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75  ns of tables fou
29490 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a  nd in pSrcList..
294a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75  */.int sqlite3Fu
294b0 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
294c0 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53  c(Expr *pExpr, S
294d0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
294e0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
294f0 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
29500 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20   cnt;.  assert( 
29510 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
29520 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
29530 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
29540 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
29550 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
29560 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
29570 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
29580 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
29590 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
295a0 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
295b0 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
295c0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
295d0 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
295e0 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
295f0 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
29600 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
29610 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
29620 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
29630 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
29640 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
29650 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
29660 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
29670 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
29680 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
29690 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
296a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
296b0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
296c0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
296d0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
296e0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
296f0 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
29700 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
29710 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
29720 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
29730 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
29740 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
29750 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
29760 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
29770 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
29780 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
29790 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
297a0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
297b0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
297c0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
297d0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
297e0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
297f0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
29800 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
29810 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
29820 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
29830 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
29840 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
29850 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
29860 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
29870 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
29880 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
29890 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
298a0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
298b0 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
298c0 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
298d0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
298e0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
298f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
29900 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
29910 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
29920 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
29930 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
29940 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
29950 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
29960 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
29970 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
29980 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
29990 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
299a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
299b0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
299c0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
299d0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
299e0 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
299f0 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
29a00 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
29a10 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
29a20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
29a30 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
29a40 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
29a50 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
29a60 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
29a70 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
29a80 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
29a90 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
29aa0 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
29ab0 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
29ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
29ad0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
29ae0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
29af0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
29b00 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
29b10 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
29b20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
29b30 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
29b40 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
29b50 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
29b60 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
29b70 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
29b80 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
29b90 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
29ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
29bb0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
29bc0 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
29bd0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
29be0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
29bf0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
29c00 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
29c10 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
29c20 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
29c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
29c40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
29c50 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
29c60 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
29c70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29c80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
29c90 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
29ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
29cb0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
29cc0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
29cd0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
29ce0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
29cf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
29d00 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
29d10 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
29d20 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
29d30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
29d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
29d50 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
29d60 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
29d70 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
29d80 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
29d90 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
29da0 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
29db0 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
29dc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
29dd0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
29de0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
29df0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
29e00 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
29e10 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
29e20 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
29e30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
29e40 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
29e50 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
29e60 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
29e70 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
29e80 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
29e90 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
29ea0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29ed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
29ee0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
29ef0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
29f00 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
29f10 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
29f20 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
29f30 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
29f40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
29f50 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
29f60 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
29f70 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
29f80 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
29f90 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
29fa0 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
29fb0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
29fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29fd0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
29fe0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2a000 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
2a010 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2a020 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2a030 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
2a040 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2a050 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
2a060 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2a070 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
2a080 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2a0a0 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
2a0b0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
2a0c0 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
2a0d0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
2a0f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2a100 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
2a110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a120 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
2a130 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a140 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
2a150 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
2a180 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
2a190 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2a1a0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
2a1b0 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
2a1c0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
2a1d0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
2a1e0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
2a1f0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
2a200 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2a210 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2a220 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
2a230 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
2a240 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2a270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a280 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a290 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
2a2a0 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2c0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2a2d0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
2a2e0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
2a2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a300 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2a310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a320 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
2a330 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
2a340 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
2a350 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
2a360 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
2a370 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
2a380 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
2a390 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
2a3a0 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
2a3b0 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
2a3c0 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
2a3d0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
2a3e0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
2a3f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
2a400 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
2a410 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
2a420 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2a430 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2a440 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
2a450 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
2a460 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2a470 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2a480 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2a490 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
2a4a0 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
2a4b0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
2a4c0 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
2a4d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a4e0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
2a4f0 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
2a500 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
2a510 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
2a520 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
2a530 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
2a540 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
2a550 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
2a560 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
2a570 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
2a580 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
2a590 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
2a5a0 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
2a5b0 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
2a5c0 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
2a5d0 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
2a5e0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2a5f0 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
2a600 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
2a610 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
2a620 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
2a630 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
2a640 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
2a650 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
2a660 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a670 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2a680 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
2a690 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
2a6a0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2a6b0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2a6c0 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
2a6d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2a6e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a6f0 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
2a700 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
2a710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
2a720 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2a730 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2a740 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
2a750 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
2a760 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
2a770 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
2a780 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
2a790 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
2a7a0 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
2a7b0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
2a7c0 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
2a7d0 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
2a7e0 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
2a7f0 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
2a800 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2a810 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
2a820 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2a830 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a840 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
2a850 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2a860 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
2a870 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
2a880 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
2a890 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
2a8a0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
2a8b0 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
2a8c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2a8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
2a8e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2a8f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2a900 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
2a910 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2a920 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
2a930 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
2a940 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
2a950 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2a960 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20  r->u.zToken, .  
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a980 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
2a990 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
2a9a0 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
2a9b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2a9c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
2a9d0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2a9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a9f0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2aa00 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2aa10 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
2aa20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2aa30 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2aa40 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2aa50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2aa60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2aa70 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
2aa80 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
2aa90 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2aaa0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2aab0 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
2aac0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2aad0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2aae0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2aaf0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2ab00 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
2ab10 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2ab20 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2ab30 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
2ab40 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2ab50 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
2ab60 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2ab70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2ab80 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2ab90 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2aba0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2abb0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
2abc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2abd0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2abe0 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
2abf0 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2ac00 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
2ac10 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2ac20 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2ac30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ac40 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55  ER(pWalker);.  U
2ac50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ac60 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
2ac70 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2ac80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
2ac90 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  e the pExpr expr
2aca0 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
2acb0 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
2acc0 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
2acd0 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
2ace0 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
2acf0 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a  d to AggInfo obj
2ad00 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41  ect that pNC->pA
2ad10 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73  ggInfo.** points
2ad20 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c   to.  Additional
2ad30 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
2ad40 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  e on the AggInfo
2ad50 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65   object as.** ne
2ad60 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
2ad70 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
2ad80 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2ad90 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
2ada0 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
2adb0 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
2adc0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
2add0 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
2ade0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
2adf0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
2ae00 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
2ae10 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2ae20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
2ae30 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
2ae40 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
2ae50 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2ae60 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
2ae70 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2ae80 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2ae90 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
2aea0 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
2aeb0 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
2aec0 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
2aed0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2aee0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
2aef0 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
2af00 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2af10 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
2af20 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
2af30 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
2af40 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
2af50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2af60 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
2af70 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
2af80 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
2af90 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
2afa0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2afb0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
2afc0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2afd0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2afe0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
2aff0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2b000 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2b010 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2b020 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
2b030 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
2b040 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
2b050 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2b060 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2b070 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
2b080 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2b090 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
2b0a0 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
2b0b0 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
2b0c0 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
2b0d0 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
2b0e0 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
2b0f0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2b100 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2b110 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2b120 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
2b130 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
2b140 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
2b150 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
2b160 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
2b170 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
2b180 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2b190 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
2b1a0 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
2b1b0 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
2b1c0 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
2b1d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
2b1e0 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
2b1f0 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
2b200 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2b210 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
2b220 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64  eallocation is d
2b230 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
2b240 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c  e column cache l
2b250 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a  ine that uses.**
2b260 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65   the register be
2b270 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a  comes stale..*/.
2b280 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
2b290 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
2b2a0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2b2b0 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
2b2c0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
2b2d0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
2b2e0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
2b2f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b300 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
2b310 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  he *p;.    for(i
2b320 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
2b330 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
2b340 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
2b350 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69  +, p++){.      i
2b360 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
2b370 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74   ){.        p->t
2b380 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  empReg = 1;.    
2b390 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2b3a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
2b3b0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
2b3c0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
2b3d0 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
2b3e0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2b3f0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
2b400 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
2b410 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
2b420 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ters..*/.int sql
2b430 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2b440 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2b450 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
2b460 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65   i, n;.  if( nRe
2b470 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71  g==1 ) return sq
2b480 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2b490 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70  pParse);.  i = p
2b4a0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2b4b0 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
2b4c0 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
2b4d0 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20   nReg<=n ){.    
2b4e0 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43  assert( !usedAsC
2b4f0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
2b500 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a  e, i, i+n-1) );.
2b510 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
2b520 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
2b530 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2b540 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
2b550 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
2b560 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
2b570 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2b580 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
2b590 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
2b5a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2b5b0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
2b5c0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
2b5d0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66   int nReg){.  if
2b5e0 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
2b5f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2b600 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
2b610 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Reg);.    return
2b620 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2b630 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
2b640 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
2b650 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
2b660 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2b670 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2b680 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
2b690 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
2b6a0 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
2b6b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
2b6c0 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
2b6d0 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
2b6e0 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
2b6f0 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
2b700 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
2b710 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
2b720 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
2b730 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
2b740 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
2b750 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
2b760 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68  *.** Validate th
2b770 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20  at no temporary 
2b780 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77  register falls w
2b790 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2b7a0 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c  of.** iFirst..iL
2b7b0 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
2b7c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2b7d0 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20   only call from 
2b7e0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a  within assert().
2b7f0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ** statements..*
2b800 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2b810 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
2b820 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
2b830 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2b840 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69  nt iFirst, int i
2b850 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Last){.  int i;.
2b860 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52    if( pParse->nR
2b870 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20  angeReg>0.   && 
2b880 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2b890 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g+pParse->nRange
2b8a0 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20  Reg<iLast.   && 
2b8b0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2b8c0 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20  g>=iFirst.  ){. 
2b8d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2b8e0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2b8f0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
2b900 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
2b910 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2b920 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
2b930 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2b940 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
2b950 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2b960 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
2b970 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2b980 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.