/ Hex Artifact Content
Login

Artifact 32bbbf7ef8d0e49e346612b1832a51a3dcf41818:


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 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72  ne object will r
32e0: 65 66 65 72 65 6e 63 65 20 70 56 65 63 74 6f 72  eference pVector
32f0: 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f 72 20   and so pVector 
3300: 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76  must remain.** v
3310: 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c 69 66  alid for the lif
3320: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
3330: 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 70 56  d object.  If pV
3340: 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 56 45  ector is a TK_VE
3350: 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61  CTOR.** or a sca
3360: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  lar expression, 
3370: 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65 20 64  then it can be d
3380: 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e 20 61  eleted as soon a
3390: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  s this routine.*
33a0: 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  * returns..**.**
33b0: 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61 75 73   A trick to caus
33c0: 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 70 56  e a TK_SELECT pV
33d0: 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65 6c 65  ector to be dele
33e0: 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74  ted together wit
33f0: 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65  h.** the returne
3400: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 69 73  d Expr object is
3410: 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 70   to attach the p
3420: 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20 70 52  Vector to the pR
3430: 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66  ight field.** of
3440: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 54 4b   the returned TK
3450: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45  _SELECT_COLUMN E
3460: 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45  xpr object..*/.E
3470: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
3480: 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 0a  ForVectorField(.
3490: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
34a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
34b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
34c0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20  xpr *pVector,   
34d0: 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74 6f      /* The vecto
34e0: 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78 70 72  r.  List of expr
34f0: 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62  essions or a sub
3500: 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74  -SELECT */.  int
3510: 20 69 46 69 65 6c 64 20 20 20 20 20 20 20 20 20   iField         
3520: 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d    /* Which colum
3530: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
3540: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a  to return */.){.
3550: 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a 20 20    Expr *pRet;.  
3560: 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d  if( pVector->op=
3570: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
3580: 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f    assert( pVecto
3590: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
35a0: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f  sSelect );.    /
35b0: 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f  * The TK_SELECT_
35c0: 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65  COLUMN Expr node
35d0: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
35e0: 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20 20  pLeft:          
35f0: 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e   pVector contain
3600: 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  ing TK_SELECT.  
3610: 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20 20 20    ** pRight:    
3620: 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64 2e 20        not used. 
3630: 20 42 75 74 20 72 65 63 75 72 73 69 76 65 6c 79   But recursively
3640: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3650: 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20 20 20   iColumn:       
3660: 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c    Index of a col
3670: 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72 0a 20  umn in pVector. 
3680: 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54 61     ** pLeft->iTa
3690: 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e 20  ble:   First in 
36a0: 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
36b0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73  ster holding res
36c0: 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a 2a  ult, or 0.    **
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20    if the result 
36f0: 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70 75  is not yet compu
3700: 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
3710: 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  ** sqlite3ExprDe
3720: 6c 65 74 65 28 29 20 73 70 65 63 69 66 69 63 61  lete() specifica
3730: 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72 65  lly skips the re
3740: 63 75 72 73 69 76 65 20 64 65 6c 65 74 65 20 6f  cursive delete o
3750: 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20 6f  f.    ** pLeft o
3760: 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  n TK_SELECT_COLU
3770: 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20 70  MN nodes.  But p
3780: 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77 65  Right is followe
3790: 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20 20  d, so pVector.  
37a0: 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74 74 61    ** can be atta
37b0: 63 68 65 64 20 74 6f 20 70 52 69 67 68 74 20 74  ched to pRight t
37c0: 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e 6f 64  o cause this nod
37d0: 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65 72 73  e to take owners
37e0: 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20 70 56  hip of.    ** pV
37f0: 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61 6c 6c  ector.  Typicall
3800: 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20  y there will be 
3810: 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c 45  multiple TK_SELE
3820: 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 0a  CT_COLUMN nodes.
3830: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
3840: 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69 6e 74  same pLeft point
3850: 65 72 20 74 6f 20 74 68 65 20 70 56 65 63 74 6f  er to the pVecto
3860: 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20  r, but only one 
3870: 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 77  of them.    ** w
3880: 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56 65 63  ill own the pVec
3890: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
38a0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 50 45  pRet = sqlite3PE
38b0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53  xpr(pParse, TK_S
38c0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20 30 2c  ELECT_COLUMN, 0,
38d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
38e0: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52  pRet ){.      pR
38f0: 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46  et->iColumn = iF
3900: 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74  ield;.      pRet
3910: 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f  ->pLeft = pVecto
3920: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
3930: 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20  ert( pRet==0 || 
3940: 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  pRet->iTable==0 
3950: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3960: 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d  if( pVector->op=
3970: 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65  =TK_VECTOR ) pVe
3980: 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  ctor = pVector->
3990: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
39a0: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52  d].pExpr;.    pR
39b0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
39c0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
39d0: 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d  pVector, 0);.  }
39e0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
39f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
3a00: 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ine(SQLITE_OMIT_
3a10: 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a  SUBQUERY) */../*
3a20: 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f  .** If expressio
3a30: 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74 79  n pExpr is of ty
3a40: 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65  pe TK_SELECT, ge
3a50: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
3a60: 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52  valuate.** it. R
3a70: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
3a80: 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  er in which the 
3a90: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
3aa0: 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a   (or, if the .**
3ab0: 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75   sub-select retu
3ac0: 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  rns more than on
3ad0: 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69  e column, the fi
3ae0: 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 0a  rst in an array.
3af0: 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ** of registers 
3b00: 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73  in which the res
3b10: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e 0a  ult is stored)..
3b20: 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
3b30: 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43  s not a TK_SELEC
3b40: 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65  T expression, re
3b50: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
3b60: 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53 75  c int exprCodeSu
3b70: 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  bselect(Parse *p
3b80: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
3b90: 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d  pr){.  int reg =
3ba0: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
3bb0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
3bc0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3bd0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
3be0: 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65 33     reg = sqlite3
3bf0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
3c00: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
3c10: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
3c20: 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a   return reg;.}..
3c30: 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
3c40: 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  Vector points to
3c50: 20 61 20 76 65 63 74 6f 72 20 65 78 70 72 65 73   a vector expres
3c60: 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20 61 20  sion - either a 
3c70: 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20  TK_VECTOR.** or 
3c80: 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74 20 72  TK_SELECT that r
3c90: 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
3ca0: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69   one column. Thi
3cb0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
3cc0: 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  ns.** the regist
3cd0: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  er number of a r
3ce0: 65 67 69 73 74 65 72 20 74 68 61 74 20 63 6f 6e  egister that con
3cf0: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
3d00: 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 46  of.** element iF
3d10: 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74  ield of the vect
3d20: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65  or..**.** If pVe
3d30: 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c  ctor is a TK_SEL
3d40: 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ECT expression, 
3d50: 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 69 74  then code for it
3d60: 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a 20 61   must have .** a
3d70: 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65  lready been gene
3d80: 72 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  rated using the 
3d90: 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63  exprCodeSubselec
3da0: 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e 20  t() routine. In 
3db0: 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70 61 72  this.** case par
3dc0: 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65 63 74  ameter regSelect
3dd0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 66   should be the f
3de0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3df0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 2a 2a   of registers.**
3e00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
3e10: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
3e20: 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a  ub-select. .**.*
3e30: 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20  * If pVector is 
3e40: 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f  of type TK_VECTO
3e50: 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72  R, then code for
3e60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 66   the requested f
3e70: 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65 72  ield.** is gener
3e80: 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ated. In this ca
3e90: 73 65 20 28 2a 70 52 65 67 46 72 65 65 29 20 6d  se (*pRegFree) m
3ea0: 61 79 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ay be set to the
3eb0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 20   number of.** a 
3ec0: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
3ed0: 65 72 20 74 6f 20 62 65 20 66 72 65 65 64 20 62  er to be freed b
3ee0: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 65 66  y the caller bef
3ef0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
3f00: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3f10: 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20 70 61  rning, output pa
3f20: 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78 70 72  rameter (*ppExpr
3f30: 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  ) is set to poin
3f40: 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70 72  t to the.** Expr
3f50: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3f60: 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e 74  nding to element
3f70: 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20 76 65   iElem of the ve
3f80: 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctor..*/.static 
3f90: 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72 52 65  int exprVectorRe
3fa0: 67 69 73 74 65 72 28 0a 20 20 50 61 72 73 65 20  gister(.  Parse 
3fb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
3fd0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
3fe0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20  Expr *pVector,  
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65 78 74  /* Vector to ext
4010: 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f  ract element fro
4020: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c  m */.  int iFiel
4030: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
4040: 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 20         /* Field 
4050: 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20  to extract from 
4060: 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  pVector */.  int
4070: 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20 20 20   regSelect,     
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4090: 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f  First in array o
40a0: 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  f registers */. 
40b0: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20   Expr **ppExpr, 
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65 73 73   /* OUT: Express
40e0: 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ion element */. 
40f0: 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65 20 20   int *pRegFree  
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72 65   /* OUT: Temp re
4120: 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 2a  gister to free *
4130: 2f 0a 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70  /.){.  u8 op = p
4140: 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73  Vector->op;.  as
4150: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45 43  sert( op==TK_VEC
4160: 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45  TOR || op==TK_RE
4170: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
4180: 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 69 66 28  _SELECT );.  if(
4190: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
41a0: 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20   ){.    *ppExpr 
41b0: 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
41c0: 69 65 6c 64 53 75 62 65 78 70 72 28 70 56 65 63  ieldSubexpr(pVec
41d0: 74 6f 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20 20  tor, iField);.  
41e0: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
41f0: 2d 3e 69 54 61 62 6c 65 2b 69 46 69 65 6c 64 3b  ->iTable+iField;
4200: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
4210: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
4220: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
4230: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
4240: 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e  List->a[iField].
4250: 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65 74 75  pExpr;.     retu
4260: 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69 46 69  rn regSelect+iFi
4270: 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78  eld;.  }.  *ppEx
4280: 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  pr = pVector->x.
4290: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  pList->a[iField]
42a0: 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e  .pExpr;.  return
42b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
42c0: 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a 70 70  Temp(pParse, *pp
42d0: 45 78 70 72 2c 20 70 52 65 67 46 72 65 65 29 3b  Expr, pRegFree);
42e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73  .}../*.** Expres
42f0: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
4300: 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
4310: 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20 76 61  en two vector va
4320: 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a  lues. Compute.**
4330: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
4340: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28 31  he comparison (1
4350: 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61 6e  , 0, or NULL) an
4360: 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20  d write that.** 
4370: 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69  result into regi
4380: 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a  ster dest..**.**
4390: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
43a0: 20 73 61 74 69 73 66 79 20 74 68 65 20 66 6f 6c   satisfy the fol
43b0: 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64 69 74  lowing precondit
43c0: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69  ions:.**.**    i
43d0: 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  f pExpr->op==TK_
43e0: 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f  IS:      op==TK_
43f0: 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54  EQ and p5==SQLIT
4400: 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 69  E_NULLEQ.**    i
4410: 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  f pExpr->op==TK_
4420: 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f  ISNOT:   op==TK_
4430: 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54  NE and p5==SQLIT
4440: 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f  E_NULLEQ.**    o
4450: 74 68 65 72 77 69 73 65 3a 20 20 20 20 20 20 20  therwise:       
4460: 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70 45 78           op==pEx
4470: 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d 30  pr->op and p5==0
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72  codeVectorCompar
44a0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
44b0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  se,        /* Co
44c0: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 6f 6e  de generator con
44d0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
44e0: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
44f0: 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  /* The compariso
4500: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
4510: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
4520: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
4530: 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74 68 69  results into thi
4540: 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
4550: 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  u8 op,          
4560: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
4570: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  son operator */.
4580: 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
4590: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
45a0: 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72 6f  E_NULLEQ or zero
45b0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
45c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
45d0: 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20  ;.  Expr *pLeft 
45e0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
45f0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
4600: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
4610: 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71    int nLeft = sq
4620: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
4630: 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 69 6e  ize(pLeft);.  in
4640: 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c 65  t i;.  int regLe
4650: 66 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  ft = 0;.  int re
4660: 67 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 75 38  gRight = 0;.  u8
4670: 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e 74   opx = op;.  int
4680: 20 61 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c 69   addrDone = sqli
4690: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
46a0: 28 76 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  (v);..  assert( 
46b0: 6e 4c 65 66 74 3d 3d 73 71 6c 69 74 65 33 45 78  nLeft==sqlite3Ex
46c0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
46d0: 67 68 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ght) );.  assert
46e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
46f0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
4700: 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20 7c  =TK_NE .       |
4710: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4720: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IS || pExpr->op=
4730: 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20  =TK_ISNOT .     
4740: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
4750: 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_LT || pExpr->
4760: 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20  op==TK_GT .     
4770: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
4780: 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_LE || pExpr->
4790: 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b 0a  op==TK_GE .  );.
47a0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
47b0: 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70  >op==op || (pExp
47c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20  r->op==TK_IS && 
47d0: 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20  op==TK_EQ).     
47e0: 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72         || (pExpr
47f0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26  ->op==TK_ISNOT &
4800: 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a  & op==TK_NE) );.
4810: 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 30 20    assert( p5==0 
4820: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70  || pExpr->op!=op
4830: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35   );.  assert( p5
4840: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  ==SQLITE_NULLEQ 
4850: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70  || pExpr->op==op
4860: 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51 4c   );..  p5 |= SQL
4870: 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20 69  ITE_STOREP2;.  i
4880: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20  f( opx==TK_LE ) 
4890: 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69  opx = TK_LT;.  i
48a0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20  f( opx==TK_GE ) 
48b0: 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20  opx = TK_GT;..  
48c0: 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f  regLeft = exprCo
48d0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
48e0: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72 65  se, pLeft);.  re
48f0: 67 52 69 67 68 74 20 3d 20 65 78 70 72 43 6f 64  gRight = exprCod
4900: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
4910: 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20 20 66  e, pRight);..  f
4920: 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70  or(i=0; 1 /*Loop
4930: 20 65 78 69 74 73 20 62 79 20 22 62 72 65 61 6b   exits by "break
4940: 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  "*/; i++){.    i
4950: 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 2c  nt regFree1 = 0,
4960: 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
4970: 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52     Expr *pL, *pR
4980: 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72  ; .    int r1, r
4990: 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  2;.    assert( i
49a0: 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74 20 29  >=0 && i<nLeft )
49b0: 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 20  ;.    if( i>0 ) 
49c0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
49d0: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
49e0: 20 20 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f    r1 = exprVecto
49f0: 72 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  rRegister(pParse
4a00: 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c  , pLeft, i, regL
4a10: 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72  eft, &pL, &regFr
4a20: 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65  ee1);.    r2 = e
4a30: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4a40: 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  r(pParse, pRight
4a50: 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26  , i, regRight, &
4a60: 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  pR, &regFree2);.
4a70: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
4a80: 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20  pParse, pL, pR, 
4a90: 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73  opx, r1, r2, des
4aa0: 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65 73 74  t, p5);.    test
4ab0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
4ac0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4ad0: 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
4ae0: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4af0: 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
4b00: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
4b10: 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
4b20: 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
4b30: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4b40: 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74 65  ==OP_Gt);.    te
4b50: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
4b60: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4b70: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
4b80: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4b90: 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
4ba0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4bb0: 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Eq);.    testca
4bc0: 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
4bd0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4be0: 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
4bf0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4c00: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4c10: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73 71 6c  gFree1);.    sql
4c20: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
4c30: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
4c40: 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3e  ee2);.    if( i>
4c50: 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  0 ) sqlite3ExprC
4c60: 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
4c70: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66  .    if( i==nLef
4c80: 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72 65  t-1 ){.      bre
4c90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
4ca0: 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a  ( opx==TK_EQ ){.
4cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4cc0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
4cd0: 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72 44  Not, dest, addrD
4ce0: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4cf0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
4d00: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4d10: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LL;.    }else if
4d20: 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a  ( opx==TK_NE ){.
4d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
4d50: 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65  , dest, addrDone
4d60: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
4d70: 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20  v);.      p5 |= 
4d80: 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b  SQLITE_KEEPNULL;
4d90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4da0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4db0: 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54  _LT || op==TK_GT
4dc0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c   || op==TK_LE ||
4dd0: 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
4de0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4df0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73 65  ddOp2(v, OP_Else
4e00: 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44 6f  NotEq, 0, addrDo
4e10: 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ne);.      VdbeC
4e20: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
4e30: 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56  =TK_LT);.      V
4e40: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4e50: 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20   op==TK_GT);.   
4e60: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
4e70: 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b  f(v, op==TK_LE);
4e80: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
4e90: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
4ea0: 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  GE);.      if( i
4eb0: 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78 20  ==nLeft-2 ) opx 
4ec0: 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = op;.    }.  }.
4ed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
4ee0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
4ef0: 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20 53  rDone);.}..#if S
4f00: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
4f10: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
4f20: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
4f30: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
4f40: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
4f50: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
4f60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
4f70: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
4f80: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
4f90: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
4fa0: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
4fb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
4fc0: 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73  CheckHeight(Pars
4fd0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
4fe0: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
4ff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5000: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
5010: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
5020: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
5030: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
5040: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
5050: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
5060: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5070: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
5080: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
5090: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
50a0: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
50b0: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
50c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
50d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
50e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
50f0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
5100: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
5110: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
5120: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
5130: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
5140: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
5150: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
5160: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
5170: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
5180: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
5190: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
51a0: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
51b0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
51c0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
51d0: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
51e0: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
51f0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
5200: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
5210: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
5220: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
5230: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
5240: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
5250: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
5260: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
5270: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
5280: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5290: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
52a0: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
52b0: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
52c0: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
52d0: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
52e0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
52f0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
5300: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
5310: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5320: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
5330: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
5340: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
5350: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
5360: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
5370: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
5380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
5390: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
53a0: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
53b0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
53c0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
53d0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
53e0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
53f0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5400: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
5410: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
5420: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5430: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
5440: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5450: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
5460: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5470: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5480: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
5490: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54a0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
54b0: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
54c0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
54d0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
54e0: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
54f0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
5500: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
5510: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
5520: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5530: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
5540: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
5550: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
5560: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
5570: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
5580: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
5590: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
55a0: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
55b0: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
55c0: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
55d0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
55e0: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
55f0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5600: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5610: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
5620: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
5630: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  s one..**.** Als
5640: 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50  o propagate EP_P
5650: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75  ropagate flags u
5660: 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c  p from Expr.x.pL
5670: 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67  ist to Expr.flag
5680: 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72  s,.** if appropr
5690: 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
56a0: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
56b0: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
56c0: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
56d0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
56e0: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
56f0: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
5700: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
5710: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
5720: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5730: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
5740: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
5750: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
5760: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
5770: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e   }else if( p->x.
5780: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69  pList ){.    hei
5790: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
57a0: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
57b0: 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ht);.    p->flag
57c0: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
57d0: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
57e0: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
57f0: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  ist);.  }.  p->n
5800: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5810: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   + 1;.}../*.** S
5820: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5830: 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69  ght variable usi
5840: 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65  ng the exprSetHe
5850: 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ight() function.
5860: 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68   If.** the heigh
5870: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5880: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  n the maximum al
5890: 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e  lowed expression
58a0: 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65   depth,.** leave
58b0: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
58c0: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  rse..**.** Also 
58d0: 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  propagate all EP
58e0: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
58f0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5900: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5910: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5920: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5930: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5940: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5950: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5960: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
5970: 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74  eturn;.  exprSet
5980: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
5990: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
59a0: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
59b0: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
59c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
59d0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
59e0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
59f0: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
5a00: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
5a10: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
5a20: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
5a30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
5a40: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
5a50: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
5a60: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5a70: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5a80: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
5a90: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
5aa0: 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a  .#else /* ABOVE:
5ab0: 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65    Height enforce
5ac0: 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42  ment enabled.  B
5ad0: 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66  ELOW: Height enf
5ae0: 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a  orcement off */.
5af0: 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20  /*.** Propagate 
5b00: 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65  all EP_Propagate
5b10: 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20   flags from the 
5b20: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74  Expr.x.pList int
5b30: 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e  o.** Expr.flags.
5b40: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
5b50: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
5b60: 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50  dFlags(Parse *pP
5b70: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
5b80: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e    if( p && p->x.
5b90: 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61  pList && !ExprHa
5ba0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5bb0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5bc0: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5bd0: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5be0: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5bf0: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5c00: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70   }.}.#define exp
5c10: 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65  rSetHeight(y).#e
5c20: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
5c30: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20  AX_EXPR_DEPTH>0 
5c40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
5c50: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f  outine is the co
5c60: 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72  re allocator for
5c70: 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a   Expr nodes..**.
5c80: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
5c90: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
5ca0: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
5cb0: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
5cc0: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
5cd0: 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20  is node and for 
5ce0: 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d  the pToken argum
5cf0: 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ent is a single 
5d00: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62  allocation.** ob
5d10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5d20: 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20  te3DbMalloc().  
5d30: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
5d40: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
5d50: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
5d60: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
5d70: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
5d80: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
5d90: 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c  dequote is true,
5da0: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
5db0: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
5dc0: 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49  s dequoted..** I
5dd0: 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c  f dequote is fal
5de0: 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67  se, no dequoting
5df0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
5e00: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
5e10: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
5e20: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
5e30: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
5e40: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
5e50: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
5e60: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
5e70: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
5e80: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
5e90: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
5ea0: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
5eb0: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
5ec0: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
5ed0: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
5ee0: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
5ef0: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
5f00: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
5f10: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
5f20: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
5f30: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
5f40: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
5f50: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
5f60: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
5f70: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
5f80: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
5f90: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
5fa0: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
5fb0: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
5fc0: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
5fd0: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
5fe0: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
5ff0: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
6000: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
6010: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
6020: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
6030: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
6040: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
6050: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
6060: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
6070: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
6080: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
6090: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
60a0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
60b0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
60c0: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
60d0: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
60e0: 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65  oken,    /* Toke
60f0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
6100: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
6110: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
6120: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
6130: 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b  to dequote */.){
6140: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
6150: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
6160: 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20  .  int iValue = 
6170: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  0;..  assert( db
6180: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f  !=0 );.  if( pTo
6190: 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ken ){.    if( o
61a0: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
61b0: 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20   pToken->z==0.  
61c0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
61d0: 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65  e3GetInt32(pToke
61e0: 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d  n->z, &iValue)==
61f0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  0 ){.      nExtr
6200: 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b  a = pToken->n+1;
6210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
6220: 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20  Value>=0 );.    
6230: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73  }.  }.  pNew = s
6240: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6250: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
6260: 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20  xpr)+nExtra);.  
6270: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
6280: 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
6290: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
62a0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75     pNew->op = (u
62b0: 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  8)op;.    pNew->
62c0: 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69  iAgg = -1;.    i
62d0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
62e0: 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30     if( nExtra==0
62f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
6300: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
6310: 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
6320: 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d  pNew->u.iValue =
6330: 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d   iValue;.      }
6340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
6350: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
6360: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
6370: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6380: 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20  pToken->z!=0 || 
6390: 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a  pToken->n==0 );.
63a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b          if( pTok
63b0: 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70  en->n ) memcpy(p
63c0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  New->u.zToken, p
63d0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
63e0: 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ->n);.        pN
63f0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f  ew->u.zToken[pTo
6400: 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20  ken->n] = 0;.   
6410: 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65       if( dequote
6420: 20 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f   && sqlite3Isquo
6430: 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  te(pNew->u.zToke
6440: 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[0]) ){.       
6450: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a     if( pNew->u.z
6460: 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20  Token[0]=='"' ) 
6470: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
6480: 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20  P_DblQuoted;.   
6490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
64a0: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
64b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  oken);.        }
64c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
64d0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
64e0: 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70  PR_DEPTH>0.    p
64f0: 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31  New->nHeight = 1
6500: 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20  ;.#endif  .  }. 
6510: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
6520: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6530: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
6540: 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72   node from a zer
6550: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b  o-terminated tok
6560: 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61  en that has.** a
6570: 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75  lready been dequ
6580: 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oted..*/.Expr *s
6590: 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71  qlite3Expr(.  sq
65a0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
65b0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
65c0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
65d0: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
65e0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
65f0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6600: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6610: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6620: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65  onst char *zToke
6630: 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  n      /* Token 
6640: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
6650: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
6660: 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20   Token x;.  x.z 
6670: 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20  = zToken;.  x.n 
6680: 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74  = zToken ? sqlit
6690: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
66a0: 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  n) : 0;.  return
66b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
66c0: 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29  c(db, op, &x, 0)
66d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63  ;.}../*.** Attac
66e0: 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  h subtrees pLeft
66f0: 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74   and pRight to t
6700: 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f  he Expr node pRo
6710: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f  ot..**.** If pRo
6720: 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  ot==NULL that me
6730: 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72  ans that a memor
6740: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
6750: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
6760: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65  .** In that case
6770: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62  , delete the sub
6780: 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20  trees pLeft and 
6790: 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20  pRight..*/.void 
67a0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
67b0: 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c  hSubtrees(.  sql
67c0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72  ite3 *db,.  Expr
67d0: 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20   *pRoot,.  Expr 
67e0: 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a  *pLeft,.  Expr *
67f0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20  pRight.){.  if( 
6800: 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pRoot==0 ){.    
6810: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
6820: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
6830: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6840: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
6850: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6860: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
6870: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
6880: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
6890: 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20    pRoot->pRight 
68a0: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
68b0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
68c0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
68d0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20  Right->flags;.  
68e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66    }.    if( pLef
68f0: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6900: 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b  ->pLeft = pLeft;
6910: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
6920: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
6930: 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61  ate & pLeft->fla
6940: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  gs;.    }.    ex
6950: 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f  prSetHeight(pRoo
6960: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
6970: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70   Allocate an Exp
6980: 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69  r node which joi
6990: 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77  ns as many as tw
69a0: 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a  o subtrees..**.*
69b0: 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  * One or both of
69c0: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61   the subtrees ca
69d0: 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75  n be NULL.  Retu
69e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
69f0: 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20  the new.** Expr 
6a00: 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e  node.  Or, if an
6a10: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
6a20: 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64  s, set pParse->d
6a30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c  b->mallocFailed,
6a40: 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62  .** free the sub
6a50: 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e  trees and return
6a60: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a   NULL..*/.Expr *
6a70: 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20  sqlite3PExpr(.  
6a80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6a90: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
6aa0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6ab0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
6ac0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
6ad0: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
6ae0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
6af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
6b00: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
6b10: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
6b20: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
6b30: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
6b40: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
6b50: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
6b60: 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45   token */.){.  E
6b70: 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70  xpr *p;.  if( op
6b80: 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72  ==TK_AND && pPar
6b90: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
6ba0: 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e     /* Take advan
6bb0: 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69  tage of short-ci
6bc0: 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69  rcuit false opti
6bd0: 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44  mization for AND
6be0: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
6bf0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
6c00: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52  e->db, pLeft, pR
6c10: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6c20: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
6c30: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
6c40: 3e 64 62 2c 20 6f 70 20 26 20 54 4b 46 4c 47 5f  >db, op & TKFLG_
6c50: 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31 29  MASK, pToken, 1)
6c60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6c70: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
6c80: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70  pParse->db, p, p
6c90: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
6ca0: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20   }.  if( p ) {. 
6cb0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68     sqlite3ExprCh
6cc0: 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65  eckHeight(pParse
6cd0: 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20  , p->nHeight);. 
6ce0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
6cf0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c  ../*.** Add pSel
6d00: 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e  ect to the Expr.
6d10: 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e  x.pSelect field.
6d20: 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69    Or, if pExpr i
6d30: 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64  s NULL (due.** d
6d40: 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  o a memory alloc
6d50: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74  ation failure) t
6d60: 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70  hen delete the p
6d70: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a  Select object..*
6d80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45  /.void sqlite3PE
6d90: 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72  xprAddSelect(Par
6da0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6db0: 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20   *pExpr, Select 
6dc0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28  *pSelect){.  if(
6dd0: 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45   pExpr ){.    pE
6de0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  xpr->x.pSelect =
6df0: 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78   pSelect;.    Ex
6e00: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6e10: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
6e20: 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a  t|EP_Subquery);.
6e30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
6e40: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
6e50: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
6e60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6e70: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
6e80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
6ea0: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
6eb0: 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  ->db, pSelect);.
6ec0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
6ed0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6ee0: 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
6ef0: 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28   TRUE or FALSE (
6f00: 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a  respectively),.*
6f10: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e  * then return 1.
6f20: 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20    If one cannot 
6f30: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72  determine the tr
6f40: 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65  uth value of the
6f50: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
6f60: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72  t compile-time r
6f70: 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  eturn 0..**.** T
6f80: 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
6f90: 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f  zation.  If is O
6fa0: 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65  K to return 0 he
6fb0: 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68  re even if.** th
6fc0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61  e expression rea
6fd0: 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61  lly is always fa
6fe0: 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20  lse or false (a 
6ff0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e  false negative).
7000: 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20  .** But it is a 
7010: 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20  bug to return 1 
7020: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7030: 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66  n might have dif
7040: 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61  ferent.** boolea
7050: 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66  n values in diff
7060: 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e  erent circumstan
7070: 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73  ces (a false pos
7080: 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f  itive.).**.** No
7090: 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65  te that if the e
70a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72  xpression is par
70b0: 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  t of conditional
70c0: 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a   for a.** LEFT J
70d0: 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  OIN, then we can
70e0: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74  not determine at
70f0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
7100: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
7110: 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61  is it true or fa
7120: 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72  lse, so always r
7130: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
7140: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
7150: 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a  sTrue(Expr *p){.
7160: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
7170: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
7180: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
7190: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
71a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
71b0: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
71c0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
71d0: 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73  return v!=0;.}.s
71e0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c  tatic int exprAl
71f0: 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a  waysFalse(Expr *
7200: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
7210: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
7220: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
7230: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
7240: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
7250: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
7260: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
7270: 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b  ;.  return v==0;
7280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74  .}../*.** Join t
7290: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  wo expressions u
72a0: 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72  sing an AND oper
72b0: 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72  ator.  If either
72c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
72d0: 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73  * NULL, then jus
72e0: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68  t return the oth
72f0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  er expression..*
7300: 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65  *.** If one side
7310: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
7320: 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77   the AND is know
7330: 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74  n to be false, t
7340: 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  hen instead.** o
7350: 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41  f returning an A
7360: 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a  ND expression, j
7370: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e  ust return a con
7380: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
7390: 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65   with.** a value
73a0: 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78   of false..*/.Ex
73b0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41  pr *sqlite3ExprA
73c0: 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
73d0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
73e0: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66  r *pRight){.  if
73f0: 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  ( pLeft==0 ){.  
7400: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
7410: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
7420: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
7430: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
7440: 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
7450: 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c  ysFalse(pLeft) |
7460: 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  | exprAlwaysFals
7470: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
7480: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7490: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
74a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
74b0: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
74c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
74d0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
74e0: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
74f0: 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
7500: 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  0], 0);.  }else{
7510: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20  .    Expr *pNew 
7520: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7530: 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30  oc(db, TK_AND, 0
7540: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7550: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
7560: 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c  ees(db, pNew, pL
7570: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
7580: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20    return pNew;. 
7590: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
75a0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
75b0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
75c0: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
75d0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
75e0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
75f0: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
7600: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
7610: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
7620: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
7630: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  n){.  Expr *pNew
7640: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7650: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7660: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
7670: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7680: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
7690: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
76a0: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
76b0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
76c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
76d0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
76e0: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
76f0: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7700: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
7710: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
7720: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
7730: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ist;.  assert( !
7740: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7750: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
7760: 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ct) );.  sqlite3
7770: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
7780: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e  Flags(pParse, pN
7790: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
77a0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
77b0: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
77c0: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
77d0: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
77e0: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
77f0: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
7800: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
7810: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
7820: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
7830: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
7840: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
7850: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
7860: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
7870: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
7880: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
7890: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
78a0: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
78b0: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
78c0: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
78d0: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
78e0: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
78f0: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
7900: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
7910: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
7920: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
7930: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
7940: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7950: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
7960: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
7970: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
7980: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
7990: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
79a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
79b0: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
79c0: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
79d0: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
79e0: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
79f0: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
7a00: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
7a10: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
7a20: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
7a30: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
7a40: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
7a50: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7a60: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
7a70: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7a80: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7a90: 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  z;..  if( pExpr=
7aa0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
7ab0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
7ac0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7ad0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
7ae0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7af0: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7b00: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7b10: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7b20: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7b30: 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  0 );.  if( z[1]=
7b40: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7b50: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7b60: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7b70: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7b80: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7b90: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
7ba0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   );.    pExpr->i
7bb0: 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29  Column = (ynVar)
7bc0: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
7bd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79  ;.  }else{.    y
7be0: 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20  nVar x = 0;.    
7bf0: 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  u32 n = sqlite3S
7c00: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
7c10: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
7c20: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
7c30: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7c40: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
7c50: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
7c60: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
7c70: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
7c80: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7c90: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
7ca0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
7cb0: 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ==sqlite3Atoi64(
7cc0: 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20  &z[1], &i, n-1, 
7cd0: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
7ce0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
7cf0: 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29  mn = x = (ynVar)
7d00: 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  i;.      testcas
7d10: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
7d20: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
7d30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7d40: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7d50: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7d60: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
7d70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7d80: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7d90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7da0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
7db0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
7dc0: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
7dd0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7de0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
7df0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
7e00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7e10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
7e20: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
7e30: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
7e40: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
7e50: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
7e60: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7e70: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
7e80: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  .        x = 0;.
7e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7ea0: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
7eb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
7ec0: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
7ed0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
7ee0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
7ef0: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
7f00: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
7f10: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
7f20: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
7f30: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
7f40: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
7f50: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
7f60: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
7f70: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
7f80: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
7f90: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
7fa0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
7fb0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
7fc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61     */.      ynVa
7fd0: 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r i;.      for(i
7fe0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a  =0; i<pParse->nz
7ff0: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
8000: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
8010: 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d  zVar[i] && strcm
8020: 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  p(pParse->azVar[
8030: 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i],z)==0 ){.    
8040: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
8050: 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61  lumn = x = (ynVa
8060: 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  r)i+1;.         
8070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8080: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8090: 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70  if( x==0 ) x = p
80a0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
80b0: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
80c0: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20  ->nVar);.    }. 
80d0: 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20     if( x>0 ){.  
80e0: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
80f0: 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20  ->nzVar ){.     
8100: 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20     char **a;.   
8110: 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
8120: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50  DbRealloc(db, pP
8130: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73  arse->azVar, x*s
8140: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
8150: 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29        if( a==0 )
8160: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
8170: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
8180: 69 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72  iled ); /* Error
8190: 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67   reported throug
81a0: 68 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a  h mallocFailed *
81b0: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
81c0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
81d0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
81e0: 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20  Var = a;.       
81f0: 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73   memset(&a[pPars
8200: 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78  e->nzVar], 0, (x
8210: 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a  -pParse->nzVar)*
8220: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20  sizeof(a[0]));. 
8230: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
8240: 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20  zVar = x;.      
8250: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  }.      if( z[0]
8260: 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d  !='?' || pParse-
8270: 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29  >azVar[x-1]==0 )
8280: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8290: 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72  3DbFree(db, pPar
82a0: 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b  se->azVar[x-1]);
82b0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
82c0: 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71  >azVar[x-1] = sq
82d0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
82e0: 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  b, z, n);.      
82f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69  }.    }.  } .  i
8300: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72  f( !pParse->nErr
8310: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   && pParse->nVar
8320: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8330: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8340: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
8350: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8360: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8370: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
8380: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
8390: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
83a0: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
83b0: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
83c0: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
83d0: 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  E void sqlite3Ex
83e0: 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74  prDeleteNN(sqlit
83f0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
8400: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
8410: 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20   );.  /* Sanity 
8420: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
8430: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
8440: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
8450: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
8460: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8470: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8480: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
8490: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
84a0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
84b0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
84c0: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f  enOnly) ){.    /
84d0: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
84e0: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
84f0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
8500: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
8510: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
8520: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  p->x.pList==0 ||
8530: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
8540: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
8550: 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53  t && p->op!=TK_S
8560: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73  ELECT_COLUMN ) s
8570: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8580: 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29  NN(db, p->pLeft)
8590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
85a0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
85b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
85c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
85d0: 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20  p, EP_MemToken) 
85e0: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
85f0: 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  db, p->u.zToken)
8600: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
8610: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8620: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
8630: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
8640: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8650: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
8660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8670: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8680: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  e(db, p->x.pList
8690: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
86a0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
86b0: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
86c0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
86d0: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
86e0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
86f0: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
8700: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
8710: 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c  ){.  if( p ) sql
8720: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
8730: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
8740: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8750: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c  ber of bytes all
8760: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65  ocated for the e
8770: 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74  xpression struct
8780: 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61  ure .** passed a
8790: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
87a0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c  ment. This is al
87b0: 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52  ways one of EXPR
87c0: 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58  _FULLSIZE,.** EX
87d0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
87e0: 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  r EXPR_TOKENONLY
87f0: 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SIZE..*/.static 
8800: 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69  int exprStructSi
8810: 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ze(Expr *p){.  i
8820: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8830: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
8840: 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ly) ) return EXP
8850: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b  R_TOKENONLYSIZE;
8860: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
8870: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
8880: 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45  uced) ) return E
8890: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b  XPR_REDUCEDSIZE;
88a0: 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46  .  return EXPR_F
88b0: 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  ULLSIZE;.}../*.*
88c0: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a  * The dupedExpr*
88d0: 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20  Size() routines 
88e0: 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20  each return the 
88f0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8900: 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73  required.** to s
8910: 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61  tore a copy of a
8920: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20  n expression or 
8930: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8940: 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e    They differ in
8950: 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20  .** how much of 
8960: 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73  the tree is meas
8970: 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ured..**.**     
8980: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8990: 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f  ize()     Size o
89a0: 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20  f only the Expr 
89b0: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20  structure .**   
89c0: 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53    dupedExprNodeS
89d0: 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65  ize()       Size
89e0: 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65   of Expr + space
89f0: 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20   for token.**   
8a00: 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28    dupedExprSize(
8a10: 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72  )           Expr
8a20: 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72   + token + subtr
8a30: 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a  ee components.**
8a40: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
8a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
8a90: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8aa0: 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e  StructSize() fun
8ab0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77  ction returns tw
8ac0: 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74  o values OR-ed t
8ad0: 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31  ogether:  .** (1
8ae0: 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  ) the space requ
8af0: 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20  ired for a copy 
8b00: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
8b10: 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a  cture only and .
8b20: 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78  ** (2) the EP_xx
8b30: 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64  x flags that ind
8b40: 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73  icate what the s
8b50: 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68  tructure size sh
8b60: 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20  ould be..** The 
8b70: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73  return values is
8b80: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a   always one of:.
8b90: 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  **.**      EXPR_
8ba0: 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20  FULLSIZE.**     
8bb0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8bc0: 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64  E   | EP_Reduced
8bd0: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f  .**      EXPR_TO
8be0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50  KENONLYSIZE | EP
8bf0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a  _TokenOnly.**.**
8c00: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
8c10: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
8c20: 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69  e found by maski
8c30: 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ng the return va
8c40: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72  lue.** of this r
8c50: 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66  outine with 0xff
8c60: 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61  f.  The flags ca
8c70: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
8c80: 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74  sking the.** ret
8c90: 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45  urn value with E
8ca0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
8cb0: 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  enOnly..**.** No
8cc0: 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61  te that with fla
8cd0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
8ce0: 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  CE, this routine
8cf0: 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d  s works on full-
8d00: 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63  size.** (unreduc
8d10: 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73  ed) Expr objects
8d20: 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67   as they or orig
8d30: 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74  inally construct
8d40: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8d50: 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72  ..** During expr
8d60: 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c  ession analysis,
8d70: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
8d80: 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  on is computed a
8d90: 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a  nd moved into.**
8da0: 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20   later parts of 
8db0: 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20  teh Expr object 
8dc0: 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69  and that extra i
8dd0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74  nformation might
8de0: 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20   get chopped.** 
8df0: 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65  off if the expre
8e00: 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64  ssion is reduced
8e10: 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
8e20: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f  t it does not wo
8e30: 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e  rk to.** make an
8e40: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
8e50: 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65  copy of a reduce
8e60: 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  d expression.  I
8e70: 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a  t is only legal.
8e80: 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70  ** to reduce a p
8e90: 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69  ristine expressi
8ea0: 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65  on tree from the
8eb0: 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d   parser.  The im
8ec0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
8ed0: 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75  of dupedExprStru
8ee0: 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e  ctSize() contain
8ef0: 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74   multiple assert
8f00: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
8f10: 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  at attempt.** to
8f20: 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f   enforce this co
8f30: 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61  nstraint..*/.sta
8f40: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
8f50: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8f60: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
8f70: 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20  .  int nSize;.  
8f80: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45  assert( flags==E
8f90: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c  XPRDUP_REDUCE ||
8fa0: 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20   flags==0 ); /* 
8fb0: 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61  Only one flag va
8fc0: 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20  lue allowed */. 
8fd0: 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55   assert( EXPR_FU
8fe0: 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b  LLSIZE<=0xfff );
8ff0: 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66  .  assert( (0xff
9000: 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  f & (EP_Reduced|
9010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d  EP_TokenOnly))==
9020: 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c  0 );.  if( 0==fl
9030: 61 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  ags ){.    nSize
9040: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
9050: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
9060: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9070: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
9080: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
9090: 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ed) );.    asser
90a0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
90b0: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
90c0: 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65  in) ); .    asse
90d0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
90e0: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
90f0: 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ken) );.    asse
9100: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9110: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
9120: 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  uce) );.    if( 
9130: 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78  p->pLeft || p->x
9140: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  .pList ){.      
9150: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44  nSize = EXPR_RED
9160: 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65  UCEDSIZE | EP_Re
9170: 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65  duced;.    }else
9180: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9190: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
91a0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
91b0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
91c0: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
91d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
91e0: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
91f0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9200: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
9210: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
9220: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
9230: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
9240: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
9250: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
9260: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
9270: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
9280: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
9290: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
92a0: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
92b0: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
92c0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
92d0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
92e0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
92f0: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
9300: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
9310: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9320: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
9330: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
9340: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
9350: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
9360: 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72  oken)+1;.  }.  r
9370: 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79  eturn ROUND8(nBy
9380: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
9390: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
93a0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
93b0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75  d to create a du
93c0: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a  plicate of the .
93d0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
93e0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
93f0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
9400: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
9410: 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e  is a.** mask con
9420: 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f  taining EXPRDUP_
9430: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  XXX flags..**.**
9440: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
9450: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61  ned includes spa
9460: 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63  ce to create a c
9470: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
9480: 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66  struct.** itself
9490: 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20   and the buffer 
94a0: 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45  referred to by E
94b0: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66  xpr.u.zToken, if
94c0: 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   any..**.** If t
94d0: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
94e0: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
94f0: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
9500: 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a  alue includes .*
9510: 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69  * space to dupli
9520: 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f  cate all Expr no
9530: 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  des in the tree 
9540: 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70  formed by Expr.p
9550: 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70  Left .** and Exp
9560: 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c  r.pRight variabl
9570: 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20  es (but not for 
9580: 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70  any structures p
9590: 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a  ointed to or .**
95a0: 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20   descended from 
95b0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
95c0: 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65   or Expr.x.pSele
95d0: 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a  ct variables)..*
95e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
95f0: 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20  edExprSize(Expr 
9600: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
9610: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b    int nByte = 0;
9620: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
9630: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
9640: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61  rNodeSize(p, fla
9650: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  gs);.    if( fla
9660: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
9670: 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  E ){.      nByte
9680: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
9690: 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67  e(p->pLeft, flag
96a0: 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69  s) + dupedExprSi
96b0: 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c  ze(p->pRight, fl
96c0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
96d0: 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a    return nByte;.
96e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
96f0: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
9700: 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  r to sqlite3Expr
9710: 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68  Dup(), except th
9720: 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a  at if pzBuffer .
9730: 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ** is not NULL t
9740: 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73  hen *pzBuffer is
9750: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
9760: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61  t to a buffer la
9770: 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74  rge enough .** t
9780: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
9790: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
97a0: 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  , the copies of 
97b0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28  p->u.zToken.** (
97c0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20  if applicable), 
97d0: 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f  and the copies o
97e0: 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61  f the p->pLeft a
97f0: 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70  nd p->pRight exp
9800: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20  ressions,.** if 
9810: 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75  any. Before retu
9820: 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72  rning, *pzBuffer
9830: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66   is set to the f
9840: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
9850: 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66  he.** portion of
9860: 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69   the buffer copi
9870: 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20  ed into by this 
9880: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
9890: 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75  tic Expr *exprDu
98a0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
98b0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46  xpr *p, int dupF
98c0: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
98d0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
98e0: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ew;           /*
98f0: 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
9900: 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63   */.  u8 *zAlloc
9910: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
9920: 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d  emory space from
9930: 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20   which to build 
9940: 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Expr object */. 
9950: 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b   u32 staticFlag;
9960: 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61         /* EP_Sta
9970: 74 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74  tic if space not
9980: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
9990: 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65  alloc */..  asse
99a0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
99b0: 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
99c0: 73 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d  sert( dupFlags==
99d0: 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45  0 || dupFlags==E
99e0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
99f0: 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66  .  assert( pzBuf
9a00: 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61  fer==0 || dupFla
9a10: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
9a20: 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  CE );..  /* Figu
9a30: 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20  re out where to 
9a40: 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78  write the new Ex
9a50: 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  pr structure. */
9a60: 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20  .  if( pzBuffer 
9a70: 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  ){.    zAlloc = 
9a80: 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73  *pzBuffer;.    s
9a90: 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53  taticFlag = EP_S
9aa0: 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tatic;.  }else{.
9ab0: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c      zAlloc = sql
9ac0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
9ad0: 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53  N(db, dupedExprS
9ae0: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
9af0: 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61  );.    staticFla
9b00: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  g = 0;.  }.  pNe
9b10: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
9b20: 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20  oc;..  if( pNew 
9b30: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e  ){.    /* Set nN
9b40: 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  ewSize to the si
9b50: 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ze allocated for
9b60: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
9b70: 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a  ointed to.    **
9b80: 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69   by pNew. This i
9b90: 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55  s either EXPR_FU
9ba0: 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44  LLSIZE, EXPR_RED
9bb0: 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20  UCEDSIZE or.    
9bc0: 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  ** EXPR_TOKENONL
9bd0: 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73  YSIZE. nToken is
9be0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
9bf0: 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73  er of bytes cons
9c00: 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  umed.    ** by t
9c10: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  he copy of the p
9c20: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
9c30: 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  g (if any)..    
9c40: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  */.    const uns
9c50: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
9c60: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
9c70: 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  uctSize(p, dupFl
9c80: 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ags);.    const 
9c90: 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e  int nNewSize = n
9ca0: 53 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66  StructSize & 0xf
9cb0: 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b  ff;.    int nTok
9cc0: 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70  en;.    if( !Exp
9cd0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9ce0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
9cf0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
9d00: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71       nToken = sq
9d10: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
9d20: 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a  >u.zToken) + 1;.
9d30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9d40: 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20   nToken = 0;.   
9d50: 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c   }.    if( dupFl
9d60: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ags ){.      ass
9d70: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
9d80: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
9d90: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
9da0: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
9db0: 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20  , nNewSize);.   
9dc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33   }else{.      u3
9dd0: 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65  2 nSize = (u32)e
9de0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29  xprStructSize(p)
9df0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
9e00: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29  Alloc, p, nSize)
9e10: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a  ;.      if( nSiz
9e20: 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20  e<EXPR_FULLSIZE 
9e30: 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ){ .        mems
9e40: 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65  et(&zAlloc[nSize
9e50: 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53  ], 0, EXPR_FULLS
9e60: 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20  IZE-nSize);.    
9e70: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
9e80: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64  * Set the EP_Red
9e90: 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  uced, EP_TokenOn
9ea0: 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69  ly, and EP_Stati
9eb0: 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69  c flags appropri
9ec0: 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e  ately. */.    pN
9ed0: 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45  ew->flags &= ~(E
9ee0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
9ef0: 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63  enOnly|EP_Static
9f00: 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20  |EP_MemToken);. 
9f10: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
9f20: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
9f30: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
9f40: 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70  okenOnly);.    p
9f50: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74  New->flags |= st
9f60: 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f  aticFlag;..    /
9f70: 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e  * Copy the p->u.
9f80: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69  zToken string, i
9f90: 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
9fa0: 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( nToken ){.    
9fb0: 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d    char *zToken =
9fc0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
9fd0: 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63  = (char*)&zAlloc
9fe0: 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20  [nNewSize];.    
9ff0: 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c    memcpy(zToken,
a000: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54   p->u.zToken, nT
a010: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  oken);.    }..  
a020: 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c    if( 0==((p->fl
a030: 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29  ags|pNew->flags)
a040: 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29   & EP_TokenOnly)
a050: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c   ){.      /* Fil
a060: 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78  l in the pNew->x
a070: 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77  .pSelect or pNew
a080: 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72  ->x.pList member
a090: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
a0a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a0b0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
a0c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a0d0: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  >x.pSelect = sql
a0e0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
a0f0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  , p->x.pSelect, 
a100: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  dupFlags);.     
a110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a120: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
a130: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a140: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  up(db, p->x.pLis
a150: 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  t, dupFlags);.  
a160: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a170: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77   /* Fill in pNew
a180: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77  ->pLeft and pNew
a190: 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ->pRight. */.   
a1a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a1b0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
a1c0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a1d0: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c  ly) ){.      zAl
a1e0: 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72  loc += dupedExpr
a1f0: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46  NodeSize(p, dupF
a200: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
a210: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a220: 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65  (pNew, EP_Reduce
a230: 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  d) ){.        pN
a240: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
a250: 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20  Left ?.         
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
a270: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
a280: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
a290: 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b  E, &zAlloc) : 0;
a2a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a2b0: 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68  Right = p->pRigh
a2c0: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
a2d0: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44             exprD
a2e0: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
a2f0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
a300: 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a  , &zAlloc) : 0;.
a310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a320: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
a330: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
a340: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
a350: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a360: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a370: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
a380: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
a390: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70      if( pNew->op
a3a0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
a3b0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
a3c0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a3d0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
a3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a3f0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
a400: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a410: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
a420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a430: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a440: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a450: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30  db, p->pRight, 0
a460: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a470: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
a480: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ew;.}../*.** Cre
a490: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
a4a0: 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68   deep copy of th
a4b0: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
a4c0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
a4d0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61  * argument. If a
a4e0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
a4f0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
a500: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
a510: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e  .** and the db->
a520: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
a530: 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  g set..*/.#ifnde
a540: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
a550: 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77  E.static With *w
a560: 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ithDup(sqlite3 *
a570: 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20  db, With *p){.  
a580: 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a  With *pRet = 0;.
a590: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
a5a0: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
a5b0: 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70  f(*p) + sizeof(p
a5c0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43  ->a[0]) * (p->nC
a5d0: 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20  te-1);.    pRet 
a5e0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
a5f0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
a600: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
a610: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a620: 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20       pRet->nCte 
a630: 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20  = p->nCte;.     
a640: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
a650: 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
a660: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53     pRet->a[i].pS
a670: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
a680: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
a690: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29  a[i].pSelect, 0)
a6a0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
a6b0: 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c  a[i].pCols = sql
a6c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
a6d0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c  db, p->a[i].pCol
a6e0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  s, 0);.        p
a6f0: 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  Ret->a[i].zName 
a700: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a710: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  p(db, p->a[i].zN
a720: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
a730: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a740: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23   pRet;.}.#else.#
a750: 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28   define withDup(
a760: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  x,y) 0.#endif../
a770: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
a780: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
a790: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
a7a0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
a7b0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
a7c0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
a7d0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
a7e0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
a7f0: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
a800: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
a810: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
a820: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
a830: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
a840: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
a850: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
a860: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
a870: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
a880: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
a890: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
a8a0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
a8b0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
a8c0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
a8d0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
a8e0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
a8f0: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
a900: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
a910: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
a920: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
a930: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
a940: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
a950: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
a960: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
a970: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
a980: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
a990: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
a9a0: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
a9b0: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
a9c0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
a9d0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
a9e0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
a9f0: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
aa00: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
aa10: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
aa20: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
aa30: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
aa40: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
aa50: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
aa60: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
aa70: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
aa80: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
aa90: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
aaa0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
aab0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
aac0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
aad0: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
aae0: 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
aaf0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
ab00: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20  E );.  return p 
ab10: 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  ? exprDup(db, p,
ab20: 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a   flags, 0) : 0;.
ab30: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
ab40: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
ab50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
ab60: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
ab70: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
ab80: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
ab90: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
aba0: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
abb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
abc0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
abd0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
abe0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
abf0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
ac00: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  N(db, sizeof(*pN
ac10: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
ac20: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
ac30: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
ac40: 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20   i = p->nExpr;. 
ac50: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58   if( (flags & EX
ac60: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30  PRDUP_REDUCE)==0
ac70: 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d   ) for(i=1; i<p-
ac80: 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a  >nExpr; i+=i){}.
ac90: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65    pNew->a = pIte
aca0: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
acb0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a  locRawNN(db,  i*
acc0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
acd0: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d  );.  if( pItem==
ace0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
acf0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
ad00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
ad10: 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20    } .  pOldItem 
ad20: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
ad30: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
ad40: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
ad50: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
ad60: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
ad70: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
ad80: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
ad90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
ada0: 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20  p(db, pOldExpr, 
adb0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65  flags);.    pIte
adc0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
add0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
ade0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
adf0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
ae00: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
ae10: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
ae20: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
ae30: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  tem->sortOrder =
ae40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f   pOldItem->sortO
ae50: 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rder;.    pItem-
ae60: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  >done = 0;.    p
ae70: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
ae80: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70   = pOldItem->bSp
ae90: 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74  anIsTab;.    pIt
aea0: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
aeb0: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
aec0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
aed0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
aee0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
aef0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
af00: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
af10: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
af20: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
af30: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
af40: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
af50: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
af60: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
af70: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
af80: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
af90: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
afa0: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
afb0: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
afc0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
afd0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
afe0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
aff0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
b000: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b010: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
b020: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
b030: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
b040: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
b050: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b060: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
b070: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
b080: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
b090: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b0a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b0b0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b0c0: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
b0d0: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
b0e0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
b0f0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
b100: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b110: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
b120: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
b130: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b140: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
b150: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
b160: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
b170: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
b180: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b190: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
b1a0: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
b1b0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b1c0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
b1d0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
b1e0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
b1f0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
b200: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
b210: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
b220: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
b230: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b240: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b250: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
b260: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
b270: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b280: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b290: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
b2a0: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
b2b0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b2c0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
b2d0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
b2e0: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
b2f0: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
b300: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
b310: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
b320: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
b330: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
b340: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
b350: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
b360: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
b370: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
b380: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
b390: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
b3a0: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
b3b0: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
b3c0: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
b3d0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b3e0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
b3f0: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
b400: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
b410: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
b420: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
b430: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
b440: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
b450: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
b460: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b480: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
b490: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
b4a0: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
b4b0: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
b4c0: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
b4d0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
b4e0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
b4f0: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
b500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
b510: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
b520: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b530: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
b540: 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a  Select, flags);.
b550: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
b560: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
b570: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b580: 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20  >pOn, flags);.  
b590: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
b5a0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
b5b0: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
b5c0: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
b5d0: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
b5e0: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
b5f0: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
b600: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
b610: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
b620: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
b630: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
b640: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
b650: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
b660: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
b670: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
b680: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b690: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b6a0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
b6b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
b6c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b6d0: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e   pNew->nId = p->
b6e0: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
b6f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b700: 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64  RawNN(db, p->nId
b710: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
b720: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
b730: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
b740: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
b750: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
b760: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65  0;.  }.  /* Note
b770: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68   that because th
b780: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  e size of the al
b790: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e  location for p->
b7a0: 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  a[] is not.  ** 
b7b0: 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f  necessarily a po
b7c0: 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69  wer of two, sqli
b7d0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
b7e0: 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c  ) may not be cal
b7f0: 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  led.  ** on the 
b800: 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65  duplicate create
b810: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
b820: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
b830: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
b840: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
b850: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
b860: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
b870: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
b880: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
b890: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
b8a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
b8b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b8c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b8d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b8e0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
b8f0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
b900: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
b910: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
b920: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
b930: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
b940: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
b950: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20    Select *pNew, 
b960: 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  *pPrior;.  asser
b970: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b980: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b990: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b9a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b9b0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
b9c0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b9d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b9e0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
b9f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
ba00: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
ba10: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
ba20: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
ba30: 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  cListDup(db, p->
ba40: 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20  pSrc, flags);.  
ba50: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
ba60: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ba70: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61  , p->pWhere, fla
ba80: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  gs);.  pNew->pGr
ba90: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
baa0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
bab0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67  ->pGroupBy, flag
bac0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  s);.  pNew->pHav
bad0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
bae0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
baf0: 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ing, flags);.  p
bb00: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
bb10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
bb20: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  up(db, p->pOrder
bb30: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
bb40: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
bb50: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
bb60: 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65   pPrior = sqlite
bb70: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
bb80: 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29  ->pPrior, flags)
bb90: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 29  ;.  if( pPrior )
bba0: 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
bbb0: 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
bbc0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Next = 0;.  pNew
bbd0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
bbe0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
bbf0: 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b  >pLimit, flags);
bc00: 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
bc10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bc20: 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  p(db, p->pOffset
bc30: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
bc40: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
bc50: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
bc60: 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  0;.  pNew->selFl
bc70: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
bc80: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
bc90: 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61  meral;.  pNew->a
bca0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
bcb0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
bcc0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
bcd0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65  1;.  pNew->nSele
bce0: 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65  ctRow = p->nSele
bcf0: 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70  ctRow;.  pNew->p
bd00: 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64  With = withDup(d
bd10: 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20  b, p->pWith);.  
bd20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
bd30: 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53  Name(pNew, p->zS
bd40: 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  elName);.  retur
bd50: 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a  n pNew;.}.#else.
bd60: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
bd70: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
bd80: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
bd90: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
bda0: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
bdb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
bdc0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
bdd0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
bde0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
bdf0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
be00: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
be10: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
be20: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
be30: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
be40: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  t..**.** If a me
be50: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
be60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
be70: 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73  e entire list is
be80: 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55   freed and.** NU
be90: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
bea0: 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20   If non-NULL is 
beb0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69  returned, then i
bec0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  t is guaranteed.
bed0: 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
bee0: 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73  entry was succes
bef0: 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e  sfully appended.
bf00: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
bf10: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
bf20: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
bf30: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
bf40: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bf50: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
bf60: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
bf70: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
bf80: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
bf90: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
bfa0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
bfb0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
bfc0: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
bfd0: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
bfe0: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
bff0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c000: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
c010: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
c020: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
c030: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
c040: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c050: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
c060: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
c070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
c080: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
c090: 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20     pList->nExpr 
c0a0: 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = 0;.    pList->
c0b0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
c0c0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c0d0: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
c0e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
c0f0: 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  ->a==0 ) goto no
c100: 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _mem;.  }else if
c110: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
c120: 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  & (pList->nExpr-
c130: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  1))==0 ){.    st
c140: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
c150: 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72  em *a;.    asser
c160: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
c170: 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  0 );.    a = sql
c180: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
c190: 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73  , pList->a, pLis
c1a0: 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f  t->nExpr*2*sizeo
c1b0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
c1c0: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
c1d0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
c1e0: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
c1f0: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
c200: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
c210: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31  >a!=0 );.  if( 1
c220: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
c230: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
c240: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
c250: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b  pList->nExpr++];
c260: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
c270: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  m, 0, sizeof(*pI
c280: 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d  tem));.    pItem
c290: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
c2a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
c2b0: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
c2c0: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
c2d0: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
c2e0: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
c2f0: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
c300: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
c310: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
c320: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
c330: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
c340: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
c350: 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78 70  Columns and pExp
c360: 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72 20  r form a vector 
c370: 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63 68  assignment which
c380: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
c390: 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66  SET.** clause of
c3a0: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
c3b0: 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69 73  ment.  Like this
c3c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28  :.**.**        (
c3d0: 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c  a,b,c) = (expr1,
c3e0: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20  expr2,expr3).** 
c3f0: 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d  Or:    (a,b,c) =
c400: 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46   (SELECT x,y,z F
c410: 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  ROM ....).**.** 
c420: 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66  For each term of
c430: 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73 69   the vector assi
c440: 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e  gnment, append n
c450: 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  ew entries to th
c460: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
c470: 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e 20  list pList.  In 
c480: 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73 75  the case of a su
c490: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 4c 48  bquery on the LH
c4a0: 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f  S, append.** TK_
c4b0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78  SELECT_COLUMN ex
c4c0: 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78  pressions..*/.Ex
c4d0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
c4e0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63  xprListAppendVec
c4f0: 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tor(.  Parse *pP
c500: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
c510: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c520: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c530: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  pList,       /* 
c540: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
c550: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
c560: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69  e NULL */.  IdLi
c570: 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20  st *pColumns,   
c580: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61     /* List of na
c590: 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74 68  mes of LHS of th
c5a0: 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a  e assignment */.
c5b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
c5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74           /* Vect
c5d0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  or expression to
c5e0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
c5f0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
c600: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c610: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c620: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  int n;.  int i;.
c630: 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
c640: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
c650: 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43  xpr : 0;.  /* pC
c660: 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20  olumns can only 
c670: 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61  be NULL due to a
c680: 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d  n OOM but an OOM
c690: 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20   will cause an. 
c6a0: 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20 74   ** exit prior t
c6b0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  o this routine b
c6c0: 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  eing invoked */.
c6d0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f 6c    if( NEVER(pCol
c6e0: 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20  umns==0) ) goto 
c6f0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
c700: 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ror;.  if( pExpr
c710: 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  ==0 ) goto vecto
c720: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
c730: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70    n = sqlite3Exp
c740: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
c750: 72 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d  r);.  if( pColum
c760: 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20 20  ns->nId!=n ){.  
c770: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c780: 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f  g(pParse, "%d co
c790: 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25  lumns assigned %
c7a0: 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20  d values",.     
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c7c0: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29  Columns->nId, n)
c7d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f  ;.    goto vecto
c7e0: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
c7f0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
c800: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  <n; i++){.    Ex
c810: 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73  pr *pSubExpr = s
c820: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
c830: 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c  torField(pParse,
c840: 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20   pExpr, i);.    
c850: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
c860: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
c870: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75  arse, pList, pSu
c880: 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  bExpr);.    if( 
c890: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  pList ){.      a
c8a0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
c8b0: 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20  xpr==iFirst+i+1 
c8c0: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  );.      pList->
c8d0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
c8e0: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d  ].zName = pColum
c8f0: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  ns->a[i].zName;.
c900: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
c910: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
c920: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c930: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
c940: 4c 45 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  LECT ){.    if( 
c950: 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e  pList && pList->
c960: 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 20  a[iFirst].pExpr 
c970: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c980: 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74   pList->a[iFirst
c990: 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
c9a0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b  SELECT_COLUMN );
c9b0: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
c9c0: 69 46 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e 70  iFirst].pExpr->p
c9d0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20  Right = pExpr;. 
c9e0: 20 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a       pExpr = 0;.
c9f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 76 65 63 74 6f      }.  }..vecto
ca00: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a  r_append_error:.
ca10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
ca20: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
ca30: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
ca40: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d  elete(db, pColum
ca50: 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  ns);.  return pL
ca60: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ist;.}../*.** Se
ca70: 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  t the sort order
ca80: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c   for the last el
ca90: 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76  ement on the giv
caa0: 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  en ExprList..*/.
cab0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
cac0: 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
cad0: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
cae0: 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20  t iSortOrder){. 
caf0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
cb00: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51  rn;.  assert( SQ
cb10: 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45  LITE_SO_UNDEFINE
cb20: 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  D<0 && SQLITE_SO
cb30: 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54  _ASC>=0 && SQLIT
cb40: 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20  E_SO_DESC>0 );. 
cb50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70   assert( p->nExp
cb60: 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f  r>0 );.  if( iSo
cb70: 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20  rtOrder<0 ){.   
cb80: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d   assert( p->a[p-
cb90: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
cba0: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
cbb0: 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  SC );.    return
cbc0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e  ;.  }.  p->a[p->
cbd0: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
cbe0: 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72  er = (u8)iSortOr
cbf0: 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  der;.}../*.** Se
cc00: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
cc10: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
cc20: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
cc30: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
cc40: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
cc50: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
cc60: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
cc70: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
cc80: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
cc90: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
cca0: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
ccb0: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
ccc0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
ccd0: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
cce0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
ccf0: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
cd00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
cd10: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
cd20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
cd30: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
cd40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
cd50: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
cd60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
cd70: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
cd80: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
cd90: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
cda0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
cdb0: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
cdc0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
cdd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
cde0: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
cdf0: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
ce00: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
ce10: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
ce20: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
ce30: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
ce40: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
ce50: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
ce60: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
ce70: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
ce80: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
ce90: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
cea0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
ceb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
cec0: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
ced0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
cee0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
cef0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
cf00: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
cf10: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
cf20: 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65  uote ) sqlite3De
cf30: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
cf40: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  me);.  }.}../*.*
cf50: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
cf60: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
cf70: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
cf80: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
cf90: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
cfa0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
cfb0: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
cfc0: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
cfd0: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
cfe0: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
cff0: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
d000: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
d010: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
d020: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
d030: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
d040: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
d050: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d060: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
d070: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d080: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
d090: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d0a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
d0b0: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
d0c0: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
d0d0: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
d0e0: 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70  .  ExprSpan *pSp
d0f0: 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an         /* Th
d100: 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64  e span to be add
d110: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ed */.){.  sqlit
d120: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d130: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
d140: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
d150: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
d160: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
d170: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
d180: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d190: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
d1a0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
d1b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
d1c0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
d1d0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
d1e0: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65  ocFailed || pIte
d1f0: 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d  m->pExpr==pSpan-
d200: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71  >pExpr );.    sq
d210: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d220: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
d230: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
d240: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
d250: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
d260: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
d2a0: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
d2b0: 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rt));.  }.}../*.
d2c0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
d2d0: 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74  sion list pEList
d2e0: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
d2f0: 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65  han iLimit eleme
d300: 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  nts,.** leave an
d310: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
d320: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
d330: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
d340: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20  tCheckLength(.  
d350: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
d360: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
d370: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
d380: 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e  *zObject.){.  in
d390: 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64  t mx = pParse->d
d3a0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
d3b0: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a  _LIMIT_COLUMN];.
d3c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
d3d0: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
d3e0: 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73  xpr==mx );.  tes
d3f0: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
d400: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
d410: 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45  mx+1 );.  if( pE
d420: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
d430: 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20  nExpr>mx ){.    
d440: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d450: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
d460: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22  y columns in %s"
d470: 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a  , zObject);.  }.
d480: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
d490: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
d4a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  sion list..*/.st
d4b0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
d4c0: 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69  LINE void exprLi
d4d0: 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74  stDeleteNN(sqlit
d4e0: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
d4f0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
d500: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
d510: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d520: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
d530: 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74  t->a!=0 || pList
d540: 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20  ->nExpr==0 );.  
d550: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
d560: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
d570: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
d580: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
d590: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
d5a0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
d5b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
d5c0: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
d5d0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
d5e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
d5f0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20  m->zSpan);.  }. 
d600: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d610: 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
d620: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d630: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64  , pList);.}.void
d640: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d650: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
d660: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
d670: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ist){.  if( pLis
d680: 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65  t ) exprListDele
d690: 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  teNN(db, pList);
d6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d6b0: 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20   the bitwise-OR 
d6c0: 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67  of all Expr.flag
d6d0: 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  s fields in the 
d6e0: 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73  given.** ExprLis
d6f0: 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  t..*/.u32 sqlite
d700: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63  3ExprListFlags(c
d710: 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70  onst ExprList *p
d720: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
d730: 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69    u32 m = 0;.  i
d740: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
d750: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
d760: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d770: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
d780: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
d790: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61 73  pExpr;.       as
d7a0: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
d7b0: 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 45  ;.       m |= pE
d7c0: 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  xpr->flags;.    
d7d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
d7e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
d7f0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
d800: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
d810: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
d820: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
d830: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
d840: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
d850: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
d860: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
d870: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
d880: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
d890: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
d8a0: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
d8b0: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
d8c0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
d8d0: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
d8e0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
d8f0: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
d900: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
d910: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
d920: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
d930: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
d940: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
d950: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
d960: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
d970: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
d980: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
d990: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
d9a0: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
d9b0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
d9c0: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
d9d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
d9e0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
d9f0: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
da00: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
da10: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
da20: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
da30: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
da40: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
da50: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
da60: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
da70: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
da80: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
da90: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
daa0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
dab0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
dac0: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
dad0: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
dae0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
daf0: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
db00: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
db10: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
db20: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
db30: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
db40: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
db50: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
db60: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
db70: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
db80: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
db90: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
dba0: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
dbb0: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
dbc0: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
dbd0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
dbe0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
dbf0: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
dc00: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
dc10: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
dc20: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
dc30: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
dc40: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
dc50: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
dc60: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
dc70: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
dc80: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
dc90: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
dca0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
dcb0: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
dcc0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
dcd0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
dce0: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
dcf0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
dd00: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
dd10: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
dd20: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
dd30: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
dd40: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
dd50: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
dd60: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
dd70: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
dd80: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
dd90: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
dda0: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
ddb0: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
ddc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ddd0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
dde0: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
ddf0: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
de00: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
de10: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
de20: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
de30: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
de40: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
de50: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
de60: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
de70: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
de80: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
de90: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
dea0: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
deb0: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
dec0: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
ded0: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
dee0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
def0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
df00: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
df10: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
df20: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
df30: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
df40: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
df50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
df60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
df70: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
df80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
df90: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
dfa0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
dfb0: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
dfc0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
dfd0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
dfe0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
dff0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
e000: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e010: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
e020: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e030: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
e040: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
e050: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
e060: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
e070: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e080: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
e090: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
e0a0: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
e0b0: 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45  ->eCode==3 && pE
e0c0: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
e0d0: 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a  lker->u.iCur ){.
e0e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
e0f0: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
e100: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e110: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e120: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
e130: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
e140: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
e150: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
e160: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
e170: 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20  >eCode==5 ){.   
e180: 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79       /* Silently
e190: 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70   convert bound p
e1a0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
e1b0: 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20  ppear inside of 
e1c0: 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a  CREATE.        *
e1d0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  * statements int
e1e0: 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61  o a NULL when pa
e1f0: 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45  rsing the CREATE
e200: 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20   statement text 
e210: 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  out.        ** o
e220: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
e230: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ter table */.   
e240: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
e250: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
e260: 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65  }else if( pWalke
e270: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20  r->eCode==4 ){. 
e280: 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e         /* A boun
e290: 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61  d parameter in a
e2a0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
e2b0: 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
e2c0: 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a  s from.        *
e2d0: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
e2e0: 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72  e() causes an er
e2f0: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ror */.        p
e300: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
e310: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
e320: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
e330: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
e340: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
e350: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
e360: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e370: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
e380: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
e390: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
e3a0: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
e3b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e3c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
e3d0: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
e3e0: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
e3f0: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
e400: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
e410: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
e420: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
e430: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
e440: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
e450: 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b  elect *NotUsed){
e460: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e470: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
e480: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
e490: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
e4a0: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
e4b0: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
e4c0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
e4d0: 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72  itFlag, int iCur
e4e0: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
e4f0: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
e500: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
e510: 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b  Code = initFlag;
e520: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
e530: 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
e540: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65  onstant;.  w.xSe
e550: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
e560: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
e570: 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20  ant;.  w.u.iCur 
e580: 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  = iCur;.  sqlite
e590: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
e5a0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
e5b0: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
e5c0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
e5d0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
e5e0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
e5f0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
e600: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
e610: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
e620: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
e630: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
e640: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
e650: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
e660: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
e670: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
e680: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
e690: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
e6a0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
e6b0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
e6c0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
e6d0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
e6e0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
e6f0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
e700: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
e710: 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b  sConst(p, 1, 0);
e720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
e730: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
e740: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
e750: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
e760: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
e770: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
e780: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
e790: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
e7a0: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
e7b0: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
e7c0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
e7d0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
e7e0: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
e7f0: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
e800: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
e810: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
e820: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
e830: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
e840: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
e850: 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a  Const(p, 2, 0);.
e860: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
e870: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
e880: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
e890: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
e8a0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
e8b0: 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67  .** for any sing
e8c0: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  le row of the ta
e8d0: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
e8e0: 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  iCur.  In other 
e8f0: 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78  words, the.** ex
e900: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f  pression must no
e910: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  t refer to any n
e920: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
e930: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e   function nor an
e940: 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72  y.** table other
e950: 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69   than iCur..*/.i
e960: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
e970: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78  TableConstant(Ex
e980: 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29  pr *p, int iCur)
e990: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
e9a0: 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75  sConst(p, 3, iCu
e9b0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  r);.}../*.** Wal
e9c0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
e9d0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
e9e0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
e9f0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
ea00: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
ea10: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
ea20: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
ea30: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
ea40: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
ea50: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
ea60: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
ea70: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
ea80: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
ea90: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
eaa0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
eab0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
eac0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
ead0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
eae0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
eaf0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
eb00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
eb10: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
eb20: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
eb30: 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20  , u8 isInit){.  
eb40: 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d  assert( isInit==
eb50: 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29  0 || isInit==1 )
eb60: 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  ;.  return exprI
eb70: 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e  sConst(p, 4+isIn
eb80: 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65  it, 0);.}..#ifde
eb90: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
eba0: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
ebb0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
ebc0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
ebd0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
ebe0: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
ebf0: 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f   a.** subquery o
ec00: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65  f some kind.  Re
ec10: 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
ec20: 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65  are no subquerie
ec30: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ec40: 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62  3ExprContainsSub
ec50: 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a  query(Expr *p){.
ec60: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
ec70: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
ec80: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64  of(w));.  w.eCod
ec90: 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
eca0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
ecb0: 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
ecc0: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
ecd0: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
ece0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71  IsConstant;.  sq
ecf0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
ed00: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
ed10: 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e  .eCode==0;.}.#en
ed20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
ed30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
ed40: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
ed50: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
ed60: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
ed70: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
ed80: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
ed90: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
eda0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
edb0: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
edc0: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
edd0: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
ede0: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
edf0: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
ee00: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
ee10: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
ee20: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
ee30: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
ee40: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
ee50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
ee60: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
ee70: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
ee80: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nt rc = 0;..  /*
ee90: 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
eea0: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
eeb0: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74  literal that fit
eec0: 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  s in a signed 32
eed0: 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65  -bit.  ** intege
eee0: 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49  r, then the EP_I
eef0: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c  ntValue flag wil
ef00: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
ef10: 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73  een set */.  ass
ef20: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49  ert( p->op!=TK_I
ef30: 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c  NTEGER || (p->fl
ef40: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
ef50: 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  e)!=0.          
ef60: 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
ef70: 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
ef80: 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69   &rc)==0 );..  i
ef90: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
efa0: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
efb0: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e   *pValue = p->u.
efc0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75  iValue;.    retu
efd0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
efe0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
eff0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
f000: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
f010: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
f020: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
f030: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
f040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f050: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
f060: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
f070: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f080: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
f090: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
f0a0: 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d     assert( v!=(-
f0b0: 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b  2147483647-1) );
f0c0: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
f0d0: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
f0e0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
f0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f100: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
f110: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
f120: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f130: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
f140: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
f150: 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ce that the expr
f160: 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55  ession can be NU
f170: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LL..**.** If the
f180: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68   expression migh
f190: 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20  t be NULL or if 
f1a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
f1b0: 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a  s too complex.**
f1c0: 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20   to tell return 
f1d0: 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  TRUE.  .**.** Th
f1e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
f1f0: 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ed as an optimiz
f200: 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f  ation, to skip O
f210: 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73  P_IsNull opcodes
f220: 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77  .** when we know
f230: 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61   that a value ca
f240: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48  nnot be NULL.  H
f250: 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f  ence, a false po
f260: 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72  sitive.** (retur
f270: 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69  ning TRUE when i
f280: 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65  n fact the expre
f290: 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20  ssion can never 
f2a0: 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a  be NULL) might.*
f2b0: 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72  * be a small per
f2c0: 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74  formance hit but
f2d0: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61   is otherwise ha
f2e0: 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20  rmless.  On the 
f2f0: 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61  other.** hand, a
f300: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
f310: 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45  (returning FALSE
f320: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
f330: 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a   could be NULL).
f340: 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  ** will likely r
f350: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
f360: 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53  rrect answer.  S
f370: 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  o when in doubt,
f380: 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e   return.** TRUE.
f390: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f3a0: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e  xprCanBeNull(con
f3b0: 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75  st Expr *p){.  u
f3c0: 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70  8 op;.  while( p
f3d0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
f3e0: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
f3f0: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
f400: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
f410: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
f420: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
f430: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
f440: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
f450: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
f460: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
f470: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
f480: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
f490: 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
f4a0: 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20  urn 0;.    case 
f4b0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
f4c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62   assert( p->pTab
f4d0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  !=0 );.      ret
f4e0: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
f4f0: 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e  rty(p, EP_CanBeN
f500: 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ull) ||.        
f510: 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
f520: 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e  >=0 && p->pTab->
f530: 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
f540: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
f550: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
f560: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
f570: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
f580: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
f590: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
f5a0: 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
f5b0: 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
f5c0: 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
f5d0: 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
f5e0: 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
f5f0: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
f600: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
f610: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
f620: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
f630: 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
f640: 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
f650: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
f660: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
f670: 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
f680: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
f690: 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
f6a0: 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
f6b0: 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
f6c0: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
f6d0: 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
f6e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f6f0: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
f700: 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
f710: 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
f720: 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
f730: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
f740: 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  LOB ) return 1;.
f750: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
f760: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
f770: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
f780: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
f790: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
f7a0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
f7b0: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
f7c0: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
f7d0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
f7e0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
f7f0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
f800: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
f810: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
f820: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
f830: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
f840: 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
f850: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
f860: 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
f870: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
f880: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
f890: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
f8a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
f8b0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
f8c0: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
f8d0: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
f8e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
f8f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
f900: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
f910: 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
f920: 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
f930: 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
f940: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
f950: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
f960: 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
f970: 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
f980: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
f990: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
f9a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
f9b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
f9c0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
f9d0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
f9e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f9f0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
fa00: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
fa10: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
fa20: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
fa30: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
fa40: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
fa50: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
fa60: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
fa70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
fa80: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
fa90: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
faa0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
fab0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
fac0: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
fad0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
fae0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58  n 0;.}../*.** pX
faf0: 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61   is the RHS of a
fb00: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  n IN operator.  
fb10: 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43  If pX is a SELEC
fb20: 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  T statement .** 
fb30: 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70  that can be simp
fb40: 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65  lified to a dire
fb50: 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c  ct table access,
fb60: 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20   then return.** 
fb70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
fb80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fb90: 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74  t.  If pX is not
fba0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
fbb0: 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  ent,.** or if th
fbc0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
fbd0: 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d  nt needs to be m
fbe0: 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61  anifested into a
fbf0: 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61   transient.** ta
fc00: 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ble, then return
fc10: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65   NULL..*/.#ifnde
fc20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
fc30: 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65  BQUERY.static Se
fc40: 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74  lect *isCandidat
fc50: 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a  eForInOpt(Expr *
fc60: 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  pX){.  Select *p
fc70: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
fc80: 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c;.  ExprList *p
fc90: 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a  EList;.  Table *
fca0: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pTab;.  int i;. 
fcb0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
fcc0: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
fcd0: 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e  Select) ) return
fce0: 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75   0;  /* Not a su
fcf0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20  bquery */.  if( 
fd00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
fd10: 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pX, EP_VarSelect
fd20: 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  )  ) return 0;  
fd30: 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75  /* Correlated su
fd40: 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e  bq */.  p = pX->
fd50: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  x.pSelect;.  if(
fd60: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
fd70: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
fd80: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
fd90: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
fda0: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
fdb0: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
fdc0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
fdd0: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
fde0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
fdf0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
fe00: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
fe10: 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
fe20: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
fe30: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
fe40: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
fe50: 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
fe60: 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
fe70: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
fe80: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
fe90: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
fea0: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
feb0: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
fec0: 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
fed0: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
fee0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
fef0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
ff00: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
ff10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
ff20: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
ff30: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
ff40: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff60: 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20   No LIMIT means 
ff70: 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  no OFFSET */.  i
ff80: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
ff90: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
ffa0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
ffb0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
ffc0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
ffd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
ffe0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
fff0: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
10000 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
10010 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
10020 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
10030 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
10040 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
10050 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
10060 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
10070 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
10080 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
10090 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
100a0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
100b0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
100c0 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
100d0 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
100e0 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
100f0 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
10100 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
10110 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
10120 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
10130 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
10140 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
10150 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73   p->pEList;.  as
10160 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
10170 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  );.  /* All SELE
10180 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
10190 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
101a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
101b0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
101c0 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
101d0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
101e0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
101f0 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
10200 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
10210 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
10220 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
10230 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
10240 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
10250 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
10260 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
10270 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10280 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
10290 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
102a0 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  n OP_Once instru
102b0 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61  ction and alloca
102c0 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 73  te space for its
102d0 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68   flag. Return th
102e0 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  e .** address of
102f0 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
10300 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
10310 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72  ite3CodeOnce(Par
10320 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
10330 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
10340 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10350 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
10360 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
10370 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  oded */.  return
10380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10390 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70  p1(v, OP_Once, p
103a0 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b  Parse->nOnce++);
103b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
103c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
103d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
103e0 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
103f0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
10400 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
10410 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
10420 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
10430 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
10440 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
10450 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
10460 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
10470 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
10480 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
10490 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
104a0 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
104b0 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
104c0 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
104d0 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
104e0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
104f0 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
10500 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
10510 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
10520 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
10530 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
10540 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
10550 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
10560 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10570 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
10580 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
10590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
105a0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
105b0 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
105c0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
105d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
105e0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
105f0 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
10600 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10610 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
10620 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
10630 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
10640 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
10650 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
10660 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10670 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
10680 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
10690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
106a0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
106b0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
106c0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
106d0 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
106e0 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
106f0 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
10700 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
10710 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
10720 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
10730 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
10740 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
10750 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
10760 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
10770 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
10780 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
10790 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
107a0 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
107b0 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
107c0 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
107d0 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
107e0 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
107f0 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
10800 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
10810 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
10820 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10830 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
10840 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
10850 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
10860 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
10870 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
10880 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
10890 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
108a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
108b0 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
108c0 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
108d0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
108e0 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
108f0 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
10900 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
10910 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
10920 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
10930 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
10940 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
10950 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
10960 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
10970 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
10980 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
10990 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
109a0 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
109b0 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
109c0 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
109d0 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
109e0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
109f0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
10a00 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
10a10 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
10a20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
10a30 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
10a40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
10a50 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
10a60 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
10a70 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
10a80 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
10a90 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
10aa0 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
10ab0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
10ac0 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
10ad0 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
10ae0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
10af0 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
10b00 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10b10 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
10b20 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
10b30 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
10b40 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
10b50 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
10b60 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
10b70 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
10b80 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
10b90 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10ba0 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
10bb0 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
10be0 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
10bf0 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
10c00 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
10c10 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
10c20 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
10c30 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c50 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
10c60 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
10c70 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
10c80 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
10c90 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
10ca0 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
10cb0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
10cc0 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
10cd0 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
10ce0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
10cf0 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
10d00 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
10d10 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
10d20 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
10d30 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
10d40 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
10d50 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
10d60 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
10d70 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
10d80 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
10d90 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
10da0 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
10db0 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
10dc0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
10dd0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
10de0 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
10df0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
10e00 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
10e10 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
10e20 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c 79   contain exactly
10e30 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73   one of the bits
10e40 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
10e50 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e  BERSHIP or IN_IN
10e60 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69 6e  DEX_LOOP.  If in
10e70 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a  Flags contains.*
10e80 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  * IN_INDEX_MEMBE
10e90 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20  RSHIP, then the 
10ea0 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20  generated table 
10eb0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
10ec0 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62 65   a.** fast membe
10ed0 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65  rship test.  Whe
10ee0 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c  n the IN_INDEX_L
10ef0 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20  OOP bit is set, 
10f00 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78 20  the.** IN index 
10f10 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
10f20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61  loop over all va
10f30 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20  lues of the RHS 
10f40 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70 65  of the.** IN ope
10f50 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  rator..**.** Whe
10f60 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  n IN_INDEX_LOOP 
10f70 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
10f80 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
10f90 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a  used to iterate.
10fa0 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ** through the s
10fb0 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e  et members) then
10fc0 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74   the b-tree must
10fd0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70   not contain dup
10fe0 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65  licates..** An e
10ff0 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
11000 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65  ust be used unle
11010 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ss the selected 
11020 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72  columns are guar
11030 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
11040 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20  unique - either 
11050 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
11060 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
11070 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a   KEY or due to.*
11080 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  * a UNIQUE const
11090 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a  raint or index..
110a0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
110b0 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
110c0 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
110d0 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
110e0 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
110f0 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
11100 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
11110 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
11120 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
11130 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e  unless <columns>
11140 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54   is a single INT
11150 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
11160 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a   column or an .*
11170 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66  * index can be f
11180 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70  ound with the sp
11190 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73  ecified <columns
111a0 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f  > as its left-mo
111b0 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
111c0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
111d0 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d  K and IN_INDEX_M
111e0 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f  EMBERSHIP are bo
111f0 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66  th set and.** if
11200 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
11210 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
11220 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
11230 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73  query) then this
11240 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  .** routine migh
11250 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72  t decide that cr
11260 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
11270 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d  ral b-tree for m
11280 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73  embership.** tes
11290 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65  ting is too expe
112a0 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e  nsive and return
112b0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20   IN_INDEX_NOOP. 
112c0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
112d0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
112e0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70  utine should imp
112f0 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70  lement the IN op
11300 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73  erator using a s
11310 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71  equence.** of Eq
11320 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f   or Ne compariso
11330 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  n operations..**
11340 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
11350 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
11360 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
11370 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
11380 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
11390 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e  might need to kn
113a0 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
113b0 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f  t the RHS side o
113c0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
113d0 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  r.** contains a 
113e0 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48  NULL.  If prRhsH
113f0 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20  asNull is not a 
11400 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
11410 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73   .** if there is
11420 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74   any chance that
11430 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74   the (...) might
11440 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
11450 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
11460 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
11470 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
11480 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
11490 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
114a0 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61  n.** to *prRhsHa
114b0 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20  sNull. If there 
114c0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
114d0 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74  t the (...) cont
114e0 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76  ains a.** NULL v
114f0 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68  alue, then *prRh
11500 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74  sHasNull is left
11510 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
11520 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
11530 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
11540 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
11550 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61  ored in *prRhsHa
11560 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74  sNull, then.** t
11570 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74  he value in that
11580 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62   register will b
11590 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d  e NULL if the b-
115a0 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  tree contains on
115b0 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c  e or more.** NUL
115c0 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74  L values, and it
115d0 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f   will be some no
115e0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
115f0 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
11600 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76  ins no.** NULL v
11610 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alues..**.** If 
11620 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65  the aiMap parame
11630 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
11640 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74   it must point t
11650 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61  o an array conta
11660 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65  ining.** one ele
11670 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f  ment for each co
11680 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
11690 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
116a0 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53  ement on the RHS
116b0 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  .** of the IN(..
116c0 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65  .) operator. The
116d0 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74   i'th entry of t
116e0 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  he array is popu
116f0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a  lated with the.*
11700 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  * offset of the 
11710 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
11720 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27  t matches the i'
11730 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  th column return
11740 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c  ed by the.** SEL
11750 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ECT. For example
11760 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  , if the express
11770 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64  ion and selected
11780 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a   index are:.**.*
11790 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28  *   (?,?,?) IN (
117a0 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
117b0 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45  ROM t1).**   CRE
117c0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
117d0 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a  t1(b, c, a);.**.
117e0 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20  ** then aiMap[] 
117f0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11800 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a  h {2, 0, 1}..*/.
11810 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11820 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
11830 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
11840 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
11850 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
11860 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11870 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
11880 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pX,             
11890 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
118a0 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
118b0 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  ) of the IN oper
118c0 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e  ator */.  u32 in
118d0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
118e0 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58       /* IN_INDEX
118f0 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48  _LOOP, _MEMBERSH
11900 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50  IP, and/or _NOOP
11910 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72  _OK */.  int *pr
11920 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20  RhsHasNull,     
11930 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11940 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61  holding NULL sta
11950 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20  tus.  See notes 
11960 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20  */.  int *aiMap 
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
11990 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20  Index fields to 
119a0 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b  RHS fields */.){
119b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20  .  Select *p;   
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
119e0 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  CT to the right 
119f0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
11a00 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
11a10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
11a30 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20  e of RHS table. 
11a40 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20  IN_INDEX_* */.  
11a50 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
11a60 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20  e->nTab++;      
11a70 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
11a80 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
11a90 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65   */.  int mustBe
11aa0 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20  Unique;         
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11ac0 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20  rue if RHS must 
11ad0 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56  be unique */.  V
11ae0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
11af0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
11b00 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
11b10 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
11b20 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
11b30 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
11b40 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75  );.  mustBeUniqu
11b50 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49  e = (inFlags & I
11b60 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30  N_INDEX_LOOP)!=0
11b70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52  ;..  /* If the R
11b80 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e  HS of this IN(..
11b90 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  .) operator is a
11ba0 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20   SELECT, and if 
11bb0 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a  it matters .  **
11bc0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
11bd0 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c  the SELECT resul
11be0 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  t contains NULL 
11bf0 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68  values, check wh
11c00 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
11c10 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c  t NULL is actual
11c20 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20  ly possible (it 
11c30 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20  may not be, for 
11c40 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20  example, due .  
11c50 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63  ** to NOT NULL c
11c60 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
11c70 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f  e schema). If no
11c80 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
11c90 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20   possible,.  ** 
11ca0 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  set prRhsHasNull
11cb0 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e   to 0 before con
11cc0 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69  tinuing.  */.  i
11cd0 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
11ce0 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20  && (pX->flags & 
11cf0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
11d00 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
11d10 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
11d20 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   = pX->x.pSelect
11d30 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
11d40 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
11d50 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11d60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11d70 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c  xprCanBeNull(pEL
11d80 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
11d90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
11da0 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73      if( i==pELis
11db0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
11dc0 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d    prRhsHasNull =
11dd0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
11de0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
11df0 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
11e00 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63  table or index c
11e10 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  an be used to.  
11e20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71  ** satisfy the q
11e30 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70  uery.  This is p
11e40 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e  referable to gen
11e50 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20  erating a new . 
11e60 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61   ** ephemeral ta
11e70 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ble.  */.  if( p
11e80 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26  Parse->nErr==0 &
11e90 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61  & (p = isCandida
11ea0 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21  teForInOpt(pX))!
11eb0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11ec0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11ed0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
11ee0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
11ef0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54  nection */.    T
11f00 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c        /* Table <
11f30 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
11f40 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  16 iDb;         
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11f70 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a  e idx for pTab *
11f80 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
11f90 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
11fa0 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  st;.    int nExp
11fb0 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
11fc0 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
11fd0 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20  p->pEList!=0 ); 
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
11ff0 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
12000 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
12010 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12020 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
12030 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42  pExpr!=0 ); /* B
12040 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
12050 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
12060 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12070 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20  p->pSrc!=0 );   
12080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
12090 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
120a0 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
120b0 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70   */.    pTab = p
120c0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
120d0 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20  b;..    /* Code 
120e0 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  an OP_Transactio
120f0 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  n and OP_TableLo
12100 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
12110 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
12120 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
12130 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
12140 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
12150 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
12160 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
12170 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
12180 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
12190 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
121a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
121b0 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20 20      assert(v);  
121c0 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62  /* sqlite3GetVdb
121d0 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20 62  e() has always b
121e0 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63  een previously c
121f0 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  alled */.    if(
12200 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c   nExpr==1 && pEL
12210 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
12220 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
12230 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e      /* The "x IN
12240 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   (SELECT rowid F
12250 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65  ROM table)" case
12260 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
12270 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
12280 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
12290 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
122a0 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  e(v);..      sql
122b0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
122c0 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
122d0 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
122e0 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
122f0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
12300 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
12310 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12320 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
12330 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
12340 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12360 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
12370 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
12380 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31   affinity_ok = 1
12390 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a  ;.      int i;..
123a0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
123b0 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
123c0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
123d0 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61  ed to perform ea
123e0 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  ch .      ** com
123f0 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
12400 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
12410 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  ity of each colu
12420 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20  mn in table.    
12430 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20    ** on the RHS 
12440 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12450 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20  or.  If it not, 
12460 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
12470 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75  le to.      ** u
12480 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20  se any index of 
12490 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20  the RHS table.  
124a0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  */.      for(i=0
124b0 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66  ; i<nExpr && aff
124c0 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a  inity_ok; i++){.
124d0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
124e0 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
124f0 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
12500 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
12510 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
12520 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
12530 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
12540 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
12550 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
12560 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
12570 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48  Tab,iCol); /* RH
12580 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  S table */.     
12590 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d     char cmpaff =
125a0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
125b0 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64  ffinity(pLhs, id
125c0 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74  xaff);.        t
125d0 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d  estcase( cmpaff=
125e0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
125f0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
12600 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
12610 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
12620 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
12630 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20   cmpaff ){.     
12640 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
12650 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  _AFF_BLOB:.     
12660 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12670 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
12680 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
12690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
126a0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
126b0 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72  ity() only retur
126c0 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73  ns TEXT if one s
126d0 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20  ide or the.     
126e0 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
126f0 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  has no affinity 
12700 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69  and the other si
12710 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e  de is TEXT.  Hen
12720 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce,.            
12730 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** the only way 
12740 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65  for cmpaff to be
12750 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78   TEXT is for idx
12760 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20  aff to be TEXT. 
12770 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
12780 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f  d for the term o
12790 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
127a0 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61   IN to have no a
127b0 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
127c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
127d0 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  idxaff==SQLITE_A
127e0 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
127f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12800 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
12810 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66  .            aff
12820 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74  inity_ok = sqlit
12830 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
12840 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20  ity(idxaff);.   
12850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
12860 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e 69        if( affini
12870 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20  ty_ok ){.       
12880 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
12890 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  n existing index
128a0 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20   that will work 
128b0 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
128c0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
128d0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
128e0 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
128f0 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49  Type==0; pIdx=pI
12900 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
12910 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f        Bitmask co
12920 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43  lUsed;      /* C
12930 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
12940 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  dex used */.    
12950 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43        Bitmask mC
12960 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ol;         /* M
12970 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72  ask for the curr
12980 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ent column */.  
12990 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
129a0 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20  ->nColumn<nExpr 
129b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
129c0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
129d0 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d   nColumn is BMS-
129e0 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f  2, not BMS-1, so
129f0 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d   that we can com
12a00 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  pute.          *
12a10 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29  * BITMASK(nExpr)
12a20 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f   without overflo
12a30 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  wing */.        
12a40 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
12a50 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32  ->nColumn==BMS-2
12a60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
12a70 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43  stcase( pIdx->nC
12a80 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a  olumn==BMS-1 );.
12a90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
12aa0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53  dx->nColumn>=BMS
12ab0 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  -1 ) continue;. 
12ac0 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75 73           if( mus
12ad0 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20  tBeUnique ){.   
12ae0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
12af0 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72  x->nKeyCol>nExpr
12b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
12b10 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
12b20 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71 75  Expr && !IsUniqu
12b30 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20  eIndex(pIdx)).  
12b40 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
12b50 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
12b60 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e  nue;  /* This in
12b70 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  dex is not uniqu
12b80 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48  e over the IN RH
12b90 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  S columns */.   
12ba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12bb0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
12bc0 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b      colUsed = 0;
12bd0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
12be0 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66   index used so f
12bf0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ar */.          
12c00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
12c10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12c20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
12c30 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
12c40 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70  eldSubexpr(pX->p
12c50 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
12c60 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68 73        Expr *pRhs
12c70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
12c80 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
12c90 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
12ca0 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
12cb0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
12cc0 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68  Parse, pLhs, pRh
12cd0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
12ce0 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20  int j;.  .      
12cf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
12d00 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69  eq!=0 || pRhs->i
12d10 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44  Column==XN_ROWID
12d20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
12d30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
12d40 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72  for(j=0; j<nExpr
12d50 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
12d60 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12d70 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68  aiColumn[j]!=pRh
12d80 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  s->iColumn ) con
12d90 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
12da0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
12db0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a  x->azColl[j] );.
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
12dd0 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c  ( pReq!=0 && sql
12de0 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71  ite3StrICmp(pReq
12df0 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
12e00 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a  zColl[j])!=0 ){.
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12e40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12e50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12e60 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
12e70 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  nExpr ) break;. 
12e80 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20             mCol 
12e90 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20  = MASKBIT(j);.  
12ea0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 43            if( mC
12eb0 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62  ol & colUsed ) b
12ec0 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f  reak; /* Each co
12ed0 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f  lumn used only o
12ee0 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nce */.         
12ef0 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43     colUsed |= mC
12f00 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
12f10 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61  if( aiMap ) aiMa
12f20 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  p[i] = j;.      
12f30 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
12f40 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45     assert( i==nE
12f50 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d  xpr || colUsed!=
12f60 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d  (MASKBIT(nExpr)-
12f70 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1) );.          
12f80 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41  if( colUsed==(MA
12f90 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20  SKBIT(nExpr)-1) 
12fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
12fb0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
12fc0 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
12fd0 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70  eans the index p
12fe0 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f  Idx is usable */
12ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
13000 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
13010 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
13020 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13030 29 3b 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c  );.  #ifndef SQL
13040 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
13050 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
13060 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13070 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c  , OP_Explain, 0,
13080 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
13090 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
130a0 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49  ntf(db, "USING I
130b0 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f  NDEX %s FOR IN-O
130c0 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a  PERATOR",pIdx->z
130d0 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
130e0 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29       P4_DYNAMIC)
130f0 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20  ;.  #endif.     
13100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13110 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
13120 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
13130 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
13140 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
13150 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
13160 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
13170 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
13180 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
13190 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
131a0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
131b0 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45   assert( IN_INDE
131c0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20  X_INDEX_DESC == 
131d0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
131e0 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  SC+1 );.        
131f0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
13200 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
13210 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
13220 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20  r[0];.  .       
13230 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
13240 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  sNull ){.       
13250 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73         *prRhsHas
13260 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
13270 3e 6e 4d 65 6d 3b 0a 20 20 23 69 66 64 65 66 20  >nMem;.  #ifdef 
13280 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
13290 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34               i64
132b0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
132c0 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
132d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
132e0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
132f0 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20  ColumnsUsed, .  
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a  iTab, 0, 0, (u8*
13320 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34  )&mask, P4_INT64
13330 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20  );.  #endif.    
13340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45            if( nE
13350 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr==1 ){.      
13360 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13370 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
13380 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48  v, iTab, *prRhsH
13390 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  asNull);.       
133a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
133b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
133c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
133d0 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
133e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
133f0 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c        } /* End l
13400 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73  oop over indexes
13410 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45   */.      } /* E
13420 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f  nd if( affinity_
13430 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a  ok ) */.    } /*
13440 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72   End if not an r
13450 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  owid index */.  
13460 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74  } /* End attempt
13470 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69   to optimize usi
13480 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a  ng an index */..
13490 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78    /* If no preex
134a0 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  isting index is 
134b0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
134c0 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a  e IN clause.  **
134d0 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   and IN_INDEX_NO
134e0 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64  OP is an allowed
134f0 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20   reply.  ** and 
13500 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13510 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
13520 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71  list, not a subq
13530 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  uery.  ** and th
13540 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e RHS is not con
13550 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f  stant or has two
13560 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c   or fewer terms,
13570 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  .  ** then it is
13580 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74   not worth creat
13590 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
135a0 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61   table to evalua
135b0 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f  te.  ** the IN o
135c0 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72  perator so retur
135d0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
135e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
135f0 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c  e==0.   && (inFl
13600 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e  ags & IN_INDEX_N
13610 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45  OOP_OK).   && !E
13620 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13630 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
13640 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33  .   && (!sqlite3
13650 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
13660 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69  pX) || pX->x.pLi
13670 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20  st->nExpr<=2).  
13680 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  ){.    eType = I
13690 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20  N_INDEX_NOOP;.  
136a0 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
136b0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c  0 ){.    /* Coul
136c0 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78  d not find an ex
136d0 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
136e0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20  index to use as 
136f0 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a  the RHS b-tree..
13700 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68      ** We will h
13710 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ave to generate 
13720 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
13730 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62  le to do the job
13740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32  ..    */.    u32
13750 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
13760 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
13770 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72  yLoop;.    int r
13780 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
13790 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
137a0 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
137b0 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  f( inFlags & IN_
137c0 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20  INDEX_LOOP ){.  
137d0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
137e0 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20  ryLoop = 0;.    
137f0 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d    if( pX->pLeft-
13800 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45  >iColumn<0 && !E
13810 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13820 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
13830 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70   ){.        eTyp
13840 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
13850 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
13860 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48  }else if( prRhsH
13870 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  asNull ){.      
13880 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  *prRhsHasNull = 
13890 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
138a0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
138b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
138c0 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
138d0 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61  arse, pX, rMayHa
138e0 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49  veNull, eType==I
138f0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a  N_INDEX_ROWID);.
13900 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
13910 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51  ryLoop = savedNQ
13920 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73  ueryLoop;.  }els
13930 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c  e{.    pX->iTabl
13940 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20  e = iTab;.  }.. 
13950 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54   if( aiMap && eT
13960 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype!=IN_INDEX_IN
13970 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65  DEX_ASC && eType
13980 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
13990 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74  _DESC ){.    int
139a0 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73   i, n;.    n = s
139b0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
139c0 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b  Size(pX->pLeft);
139d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
139e0 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d  n; i++) aiMap[i]
139f0 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = i;.  }.  retu
13a00 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64  rn eType;.}.#end
13a10 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
13a20 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13a30 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
13a40 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20  pExpr is an (?, 
13a50 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78  ?...) IN(...) ex
13a60 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a  pression. This .
13a70 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
13a80 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
13a90 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
13aa0 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ed string contai
13ab0 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66  ning .** the aff
13ac0 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73  inities to be us
13ad0 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ed for each colu
13ae0 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  mn of the compar
13af0 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ison..**.** It i
13b00 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
13b10 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
13b20 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  er to ensure tha
13b30 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  t the returned.*
13b40 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e  * string is even
13b50 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69  tually freed usi
13b60 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
13b70 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
13b80 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69  ar *exprINAffini
13b90 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ty(Parse *pParse
13ba0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
13bb0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
13bc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
13bd0 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  int nVal = sqlit
13be0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
13bf0 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63  (pLeft);.  Selec
13c00 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45  t *pSelect = (pE
13c10 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
13c20 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78  xIsSelect) ? pEx
13c30 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20  pr->x.pSelect : 
13c40 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b  0;.  char *zRet;
13c50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
13c60 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op==TK_IN );.
13c70 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33    zRet = sqlite3
13c80 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
13c90 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29  rse->db, nVal+1)
13ca0 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
13cb0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
13cc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
13cd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
13ce0 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65   *pA = sqlite3Ve
13cf0 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
13d00 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
13d10 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74    char a = sqlit
13d20 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
13d30 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  A);.      if( pS
13d40 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
13d50 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74   zRet[i] = sqlit
13d60 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
13d70 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  y(pSelect->pELis
13d80 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61  t->a[i].pExpr, a
13d90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13da0 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
13db0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
13dc0 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c   }.    zRet[nVal
13dd0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
13de0 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
13df0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
13e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
13e10 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  ERY./*.** Load t
13e20 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
13e30 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
13e40 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rst argument wit
13e50 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d  h an error .** m
13e60 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
13e70 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
13e80 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
13e90 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
13ea0 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f  cted M".*/   .vo
13eb0 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c  id sqlite3Subsel
13ec0 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a  ectError(Parse *
13ed0 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74  pParse, int nAct
13ee0 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74  ual, int nExpect
13ef0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
13f00 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c  *zFmt = "sub-sel
13f10 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63  ect returns %d c
13f20 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
13f30 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33  d %d";.  sqlite3
13f40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13f50 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20   zFmt, nActual, 
13f60 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64  nExpect);.}.#end
13f70 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
13f80 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
13f90 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
13fa0 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
13fb0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49   expression, EXI
13fc0 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70  STS,.** or IN op
13fd0 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
13fe0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
13ff0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
14000 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
14010 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
14020 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
14030 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
14040 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
14050 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
14060 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
14070 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
14080 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
14090 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
140a0 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
140b0 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
140c0 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
140d0 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
140e0 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
140f0 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
14100 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
14110 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
14120 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
14130 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
14140 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
14150 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
14160 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
14170 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
14180 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
14190 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
141a0 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
141b0 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
141c0 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
141d0 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
141e0 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
141f0 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
14200 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
14210 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
14220 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
14230 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
14240 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
14250 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
14260 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
14270 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
14280 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
14290 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
142a0 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
142b0 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
142c0 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
142d0 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
142e0 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
142f0 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
14300 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
14310 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
14320 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  ** All this rout
14330 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
14340 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73  ialize the regis
14350 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
14360 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  yHaveNull.** to 
14370 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
14380 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
14390 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  e care of changi
143a0 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
143b0 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  .** value to non
143c0 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
143d0 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
143e0 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43  *.** For a SELEC
143f0 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  T or EXISTS oper
14400 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ator, return the
14410 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
14420 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  olds the.** resu
14430 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69  lt.  For a multi
14440 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20  -column SELECT, 
14450 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
14460 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67  ored in a contig
14470 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66  uous.** array of
14480 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
14490 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
144a0 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  is the register 
144b0 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
144c0 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
144d0 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72  n.  Return 0 for
144e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
144f0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
14500 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  urs..*/.#ifndef 
14510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14520 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
14530 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
14540 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14550 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
14560 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
14570 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
14580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14590 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
145a0 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
145b0 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c  /.  int rHasNull
145c0 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52  Flag,       /* R
145d0 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
145e0 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
145f0 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
14600 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14620 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
14630 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
14640 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
14650 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20  nt jmpIfDynamic 
14660 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
14670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
14680 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
14690 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
146a0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146c0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
146d0 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
146e0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
146f0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
14700 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
14710 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
14720 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
14730 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
14740 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76  e);..  /* The ev
14750 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
14760 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54  IN/EXISTS/SELECT
14770 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65   must be repeate
14780 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a  d every time it.
14790 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
147a0 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  red if any of th
147b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
147c0 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
147d0 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
147e0 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
147f0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
14800 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
14810 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
14820 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
14830 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
14840 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
14850 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
14860 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
14870 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
14880 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
14890 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
148a0 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
148b0 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
148c0 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
148d0 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
148e0 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
148f0 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
14900 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
14910 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
14920 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
14930 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
14940 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73  jmpIfDynamic = s
14950 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
14960 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
14970 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69  rage(v);.  }..#i
14980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14990 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
149a0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
149b0 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
149c0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
149d0 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
149e0 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20  , "EXECUTE %s%s 
149f0 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20  SUBQUERY %d",.  
14a00 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d        jmpIfDynam
14a10 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c  ic>=0?"":"CORREL
14a20 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20  ATED ",.        
14a30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
14a40 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22  ?"LIST":"SCALAR"
14a50 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ,.        pParse
14a60 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a  ->iNextSelectId.
14a70 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
14a80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14a90 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
14aa0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
14ab0 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
14ac0 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  NAMIC);.  }.#end
14ad0 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  if..  switch( pE
14ae0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
14af0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
14b00 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14b20 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
14b30 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
14b40 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
14b50 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
14b60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f   pExpr->pLeft; /
14b70 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * the LHS of the
14b80 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
14b90 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
14ba0 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
14bb0 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61    /* Key informa
14bc0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
14bd0 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20  t nVal;         
14be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
14bf0 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66  e of vector pLef
14c00 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20  t */.      .    
14c10 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    nVal = sqlite3
14c20 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
14c30 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Left);.      ass
14c40 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c  ert( !isRowid ||
14c50 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20   nVal==1 );..   
14c60 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
14c70 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
14c80 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
14c90 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
14ca0 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
14cb0 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
14cc0 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
14cd0 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
14ce0 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
14cf0 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
14d00 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
14d10 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
14d20 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  ults from the . 
14d30 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f       ** SELECT o
14d40 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
14d50 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
14d60 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
14d70 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
14d80 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
14d90 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
14da0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
14db0 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
14dc0 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
14dd0 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
14de0 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
14df0 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
14e00 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
14e10 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
14e20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
14e30 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
14e40 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
14e50 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
14e60 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
14e70 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
14e80 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
14e90 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
14ea0 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
14eb0 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
14ec0 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
14ed0 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
14ee0 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
14ef0 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
14f00 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
14f10 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
14f20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
14f30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14f40 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
14f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f60 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14f70 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20  meral, .        
14f80 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
14f90 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c   (isRowid?0:nVal
14fa0 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ));.      pKeyIn
14fb0 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30  fo = isRowid ? 0
14fc0 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   : sqlite3KeyInf
14fd0 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
14fe0 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20  b, nVal, 1);..  
14ff0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
15000 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15010 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
15020 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
15030 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
15040 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
15050 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
15060 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15070 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
15080 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
15090 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
150a0 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
150b0 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
150c0 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
150d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
150e0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
150f0 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78  elect = pExpr->x
15100 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
15110 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
15120 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
15130 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61  List;..        a
15140 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20  ssert( !isRowid 
15150 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  );.        /* If
15160 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53   the LHS and RHS
15170 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
15180 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  tor do not match
15190 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  , that.        *
151a0 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76  * error will hav
151b0 65 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f  e been caught lo
151c0 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72 65 61  ng before we rea
151d0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a  ch this point. *
151e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c  /.        if( AL
151f0 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78  WAYS(pEList->nEx
15200 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20  pr==nVal) ){.   
15210 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
15220 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  t dest;.        
15230 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
15240 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
15250 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
15260 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e  SRT_Set, pExpr->
15270 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
15280 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74     dest.zAffSdst
15290 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74   = exprINAffinit
152a0 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  y(pParse, pExpr)
152b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
152c0 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62  rt( (pExpr->iTab
152d0 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d  le&0x0000FFFF)==
152e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
152f0 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 65  .          pSele
15300 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ct->iLimit = 0;.
15310 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
15320 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c  se( pSelect->sel
15330 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
15340 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
15350 20 74 65 73 74 63 61 73 65 28 20 70 4b 65 79 49   testcase( pKeyI
15360 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75  nfo==0 ); /* Cau
15370 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71  sed by OOM in sq
15380 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
15390 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  c() */.         
153a0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
153b0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
153c0 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
153d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
153e0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
153f0 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73  db, dest.zAffSds
15400 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
15410 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
15420 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ref(pKeyInfo);. 
15430 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
15440 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 0;.          }
15450 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15460 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
15470 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64  >db, dest.zAffSd
15480 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  st);.          a
15490 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21  ssert( pKeyInfo!
154a0 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c  =0 ); /* OOM wil
154b0 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74  l cause exit aft
154c0 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  er sqlite3Select
154d0 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  () */.          
154e0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
154f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
15500 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
15510 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Expr>0 );.      
15520 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
15530 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
15540 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
15550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
15560 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b  (i=0; i<nVal; i+
15570 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
15580 45 78 70 72 20 2a 70 20 3d 20 28 6e 56 61 6c 3e  Expr *p = (nVal>
15590 31 29 20 3f 20 73 71 6c 69 74 65 33 56 65 63 74  1) ? sqlite3Vect
155a0 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
155b0 4c 65 66 74 2c 20 69 29 20 3a 20 70 4c 65 66 74  Left, i) : pLeft
155c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4b  ;.            pK
155d0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
155e0 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
155f0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a  CompareCollSeq(.
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
15620 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20  t->a[i].pExpr.  
15630 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
15640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15650 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
15660 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
15670 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
15680 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
15690 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
156a0 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
156b0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
156c0 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
156d0 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
156e0 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
156f0 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
15700 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
15710 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
15720 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
15730 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
15740 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
15750 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
15760 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
15770 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
15780 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
15790 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
157a0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
157b0 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
157c0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
157d0 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
157e0 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
157f0 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
15800 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
15810 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
15820 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
15830 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
15840 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
15850 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
15860 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
15870 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
15880 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
15890 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
158a0 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
158b0 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  y(pLeft);.      
158c0 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
158d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  ){.          aff
158e0 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
158f0 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
15900 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
15910 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
15920 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
15930 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
15940 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
15950 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b   );.          pK
15960 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
15970 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15980 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
15990 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
159a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
159b0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
159c0 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
159d0 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
159e0 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
159f0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
15a00 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15a10 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
15a20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
15a40 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56  Rowid ) sqlite3V
15a50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15a60 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20  Null, 0, r2);.  
15a70 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
15a80 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
15a90 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
15aa0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
15ab0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
15ac0 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
15ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
15ae0 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
15af0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
15b00 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
15b10 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
15b20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
15b30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
15b40 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
15b50 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
15b60 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
15b70 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
15b80 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
15b90 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
15ba0 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
15bb0 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
15bc0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
15bd0 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
15be0 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
15bf0 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
15c00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15c10 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61     if( jmpIfDyna
15c20 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74  mic>=0 && !sqlit
15c30 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
15c40 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
15c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15c60 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
15c70 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20  jmpIfDynamic);. 
15c80 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66             jmpIf
15c90 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20  Dynamic = -1;.  
15ca0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
15cb0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
15cc0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15cd0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
15ce0 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
15cf0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
15d00 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71  f( isRowid && sq
15d10 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
15d20 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49  er(pE2, &iValToI
15d30 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ns) ){.         
15d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d50 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
15d60 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  tInt, pExpr->iTa
15d70 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49  ble, r2, iValToI
15d80 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ns);.          }
15d90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15da0 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78    r3 = sqlite3Ex
15db0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
15dc0 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
15dd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
15de0 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
15df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15e00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15e10 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20  MustBeInt, r3,. 
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
15e40 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15e50 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20  tAddr(v)+2);.   
15e60 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
15e70 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15e80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15e90 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15ea0 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  P_Insert, pExpr-
15eb0 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29  >iTable, r2, r3)
15ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
15ed0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
15ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15ef0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
15f00 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32  ecord, r3, 1, r2
15f10 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
15f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
15f30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
15f40 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
15f50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20  arse, r3, 1);.  
15f60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15f70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15f80 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
15f90 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
15fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
15fb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
15fd0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15fe0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
15ff0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16000 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16010 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
16020 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
16030 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
16040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
16050 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
16060 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f  (void *)pKeyInfo
16070 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
16080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
16090 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
160a0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
160b0 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
160c0 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  T:.    default: 
160d0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
160e0 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e  3:    (SELECT ..
160f0 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20  . FROM ...).    
16100 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20    **     or:    
16110 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e  EXISTS(SELECT ..
16120 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20  . FROM ...).    
16130 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
16140 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65  r a SELECT, gene
16150 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
16160 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
16170 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  all columns of. 
16180 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
16190 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72  t row into an ar
161a0 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
161b0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
161c0 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a  index of.      *
161d0 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
161e0 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ster..      **. 
161f0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
16200 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
16210 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30  ite an integer 0
16220 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
16230 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 20 20   1 (exists).    
16240 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69    ** into a regi
16250 73 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ster and return 
16260 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75  that register nu
16270 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  mber..      **. 
16280 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20       ** In both 
16290 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72 79  cases, the query
162a0 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69   is augmented wi
162b0 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41  th "LIMIT 1".  A
162c0 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65  ny .      ** pre
162d0 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69  existing limit i
162e0 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70  s discarded in p
162f0 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20  lace of the new 
16300 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a  LIMIT 1..      *
16310 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
16320 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16340 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16350 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
16360 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
16370 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
16380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
16390 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
163a0 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECT result */.
163b0 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20        int nReg; 
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
163e0 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
163f0 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74  cate */..      t
16400 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
16410 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
16420 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16430 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
16440 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61  ELECT );.      a
16450 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
16460 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
16470 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
16480 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
16490 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
164a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
164b0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20  IsSelect) );..  
164c0 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72      pSel = pExpr
164d0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
164e0 20 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d     nReg = pExpr-
164f0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f  >op==TK_SELECT ?
16500 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSel->pEList->n
16510 45 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20  Expr : 1;.      
16520 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
16530 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
16540 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b  pParse->nMem+1);
16550 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
16560 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Mem += nReg;.   
16570 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
16580 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
16590 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
165a0 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  t = SRT_Mem;.   
165b0 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20       dest.iSdst 
165c0 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
165d0 20 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64          dest.nSd
165e0 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20  st = nReg;.     
165f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16600 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
16610 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
16620 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e  , dest.iSDParm+n
16630 52 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Reg-1);.        
16640 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
16650 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72  "Init subquery r
16660 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
16670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
16680 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
16690 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
166a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
166b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
166c0 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
166d0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
166e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
166f0 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29   EXISTS result")
16700 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16710 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
16720 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
16730 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  Sel->pLimit);.  
16740 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74      pSel->pLimit
16750 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
16760 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47  pParse, TK_INTEG
16770 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ER, 0, 0,.      
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c              &sql
167a0 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
167b0 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69  );.      pSel->i
167c0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
167d0 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
167e0 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75  &= ~SF_MultiValu
167f0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  e;.      if( sql
16800 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
16810 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20  e, pSel, &dest) 
16820 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
16830 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
16840 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69     rReg = dest.i
16850 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78  SDParm;.      Ex
16860 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
16870 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
16880 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  uce);.      brea
16890 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
168a0 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  if( rHasNullFlag
168b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
168c0 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
168d0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
168e0 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20  rHasNullFlag);. 
168f0 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44   }..  if( jmpIfD
16900 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20  ynamic>=0 ){.   
16910 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16920 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e  Here(v, jmpIfDyn
16930 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  amic);.  }.  sql
16940 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
16950 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74  (pParse);..  ret
16960 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64  urn rReg;.}.#end
16970 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16980 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
16990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
169a0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
169b0 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e  * Expr pIn is an
169c0 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
169d0 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ion. This functi
169e0 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  on checks that t
169f0 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63  he .** sub-selec
16a00 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
16a10 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f  the IN() operato
16a20 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  r has the same n
16a30 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c  umber of .** col
16a40 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74  umns as the vect
16a50 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f  or on the LHS. O
16a60 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66  r, if the RHS of
16a70 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74   the IN() is not
16a80 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79   .** a sub-query
16a90 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69  , that the LHS i
16aa0 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69  s a vector of si
16ab0 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ze 1..*/.int sql
16ac0 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
16ad0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
16ae0 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74  xpr *pIn){.  int
16af0 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
16b00 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
16b10 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  (pIn->pLeft);.  
16b20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20  if( (pIn->flags 
16b30 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
16b40 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74  ){.    if( nVect
16b50 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65  or!=pIn->x.pSele
16b60 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
16b70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
16b80 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
16b90 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e  (pParse, pIn->x.
16ba0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
16bb0 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29  >nExpr, nVector)
16bc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
16bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
16be0 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29  if( nVector!=1 )
16bf0 7b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 2d 3e  {.    if( (pIn->
16c00 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
16c10 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
16c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
16c30 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
16c40 73 65 2c 20 6e 56 65 63 74 6f 72 2c 20 31 29 3b  se, nVector, 1);
16c50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16c60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16c70 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
16c80 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
16c90 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
16ca0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
16cb0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
16cc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16cd0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
16ce0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
16cf0 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
16d00 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
16d10 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
16d20 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
16d30 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
16d40 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
16d50 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
16d60 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72  ) is a scalar or
16d70 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
16d80 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67  on.  The .** rig
16d90 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
16da0 53 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  S) is an array o
16db0 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73  f zero or more s
16dc0 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72  calar values, or
16dd0 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20   a.** subquery. 
16de0 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
16df0 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e   subquery, the n
16e00 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
16e10 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20  columns must.** 
16e20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
16e30 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
16e40 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
16e50 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48   LHS.  If the RH
16e60 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f  S is.** a list o
16e70 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48  f values, the LH
16e80 53 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c  S must be a scal
16e90 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49  ar. .**.** The I
16ea0 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72  N operator is tr
16eb0 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61  ue if the LHS va
16ec0 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  lue is contained
16ed0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
16ee0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
16ef0 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c  s false if the L
16f00 48 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79  HS is definitely
16f10 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e   not in the RHS.
16f20 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74    The .** result
16f30 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
16f40 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20  presence of the 
16f50 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63  LHS in the RHS c
16f60 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74  annot be .** det
16f70 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e  ermined due to N
16f80 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ULLs..**.** This
16f90 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
16fa0 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d  es code that jum
16fb0 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  ps to destIfFals
16fc0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
16fd0 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  not .** containe
16fe0 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
16ff0 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c  .  If due to NUL
17000 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  Ls we cannot det
17010 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48  ermine if the LH
17020 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65  S.** is containe
17030 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  d in the RHS the
17040 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  n jump to destIf
17050 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48  Null.  If the LH
17060 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  S is contained.*
17070 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  * within the RHS
17080 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
17090 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  gh..**.** See th
170a0 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70  e separate in-op
170b0 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65  erator.md docume
170c0 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20  ntation file in 
170d0 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
170e0 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74   SQLite source t
170f0 72 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ree for addition
17100 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
17110 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
17120 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
17130 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17140 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
17150 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
17160 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
17170 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
17180 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
17190 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
171a0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
171b0 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a  False,      /* J
171c0 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20  ump here if LHS 
171d0 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
171e0 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   in the RHS */. 
171f0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
17200 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
17210 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ere if the resul
17220 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64  ts are unknown d
17230 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29  ue to NULLs */.)
17240 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e  {.  int rRhsHasN
17250 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67  ull = 0;  /* Reg
17260 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72  ister that is tr
17270 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69  ue if RHS contai
17280 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a  ns NULL values *
17290 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
172a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
172b0 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a  e of the RHS */.
172c0 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20    int rLhs;     
172d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
172e0 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74  ter(s) holding t
172f0 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f  he LHS values */
17300 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b  .  int rLhsOrig;
17310 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20           /* LHS 
17320 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20  values prior to 
17330 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69  reordering by ai
17340 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20  Map[] */.  Vdbe 
17350 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
17360 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
17370 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
17380 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
17390 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d   = 0;       /* M
173a0 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66  ap from vector f
173b0 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f  ield to index co
173c0 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
173d0 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  zAff = 0;       
173e0 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
173f0 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ng for compariso
17400 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63  ns */.  int nVec
17410 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tor;          /*
17420 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73   Size of vectors
17430 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
17440 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
17450 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20  Dummy;          
17460 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65   /* Dummy parame
17470 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56  ter to exprCodeV
17480 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70  ector() */.  Exp
17490 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
174a0 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66     /* The LHS of
174b0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
174c0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
174d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
174e0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
174f0 20 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20   int destStep2; 
17500 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
17510 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c  to jump when NUL
17520 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20  Ls seen in step 
17530 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  2 */.  int destS
17540 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tep6 = 0;    /* 
17550 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f  Start of code fo
17560 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e  r Step 6 */.  in
17570 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20  t addrTruthOp;  
17580 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17590 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65  f opcode that de
175a0 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20  termines the IN 
175b0 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
175c0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20   destNotNull;   
175d0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
175e0 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  if a comparison 
175f0 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73  is not true in s
17600 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
17610 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
17620 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73   /* Top of the s
17630 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a  tep-6 loop */ ..
17640 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
17650 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71  >pLeft;.  if( sq
17660 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
17670 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 20  (pParse, pExpr) 
17680 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66  ) return;.  zAff
17690 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74   = exprINAffinit
176a0 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  y(pParse, pExpr)
176b0 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71  ;.  nVector = sq
176c0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
176d0 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ize(pExpr->pLeft
176e0 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e  );.  aiMap = (in
176f0 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  t*)sqlite3DbMall
17700 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50  ocZero(.      pP
17710 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f  arse->db, nVecto
17720 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b  r*(sizeof(int) +
17730 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b   sizeof(char)) +
17740 20 31 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50   1.  );.  if( pP
17750 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
17760 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71  Failed ) goto sq
17770 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
17780 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  oom_error;..  /*
17790 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70   Attempt to comp
177a0 75 74 65 20 74 68 65 20 52 48 53 2e 20 41 66 74  ute the RHS. Aft
177b0 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 69 66  er this step, if
177c0 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
177d0 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44  than.  ** IN_IND
177e0 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72  EX_NOOP is retur
177f0 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f  ned, the table o
17800 70 65 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72  pened ith cursor
17810 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a   pExpr->iTable .
17820 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
17830 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
17840 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 20 49  ke up the RHS. I
17850 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  f IN_INDEX_NOOP 
17860 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a  is returned,.  *
17870 2a 20 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f  * the RHS has no
17880 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64  t yet been coded
17890 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
178a0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
178b0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
178c0 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
178d0 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
178e0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
178f0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
17900 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
17910 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
17920 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
17930 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
17940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
17960 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
17970 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  P | IN_INDEX_NOO
17980 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20  P_OK,.          
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d     destIfFalse==
179b0 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a  destIfNull ? 0 :
179c0 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61   &rRhsHasNull, a
179d0 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74  iMap);..  assert
179e0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
179f0 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20  | nVector==1 || 
17a00 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
17a10 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  EPH.       || eT
17a20 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
17a30 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65  DEX_ASC || eType
17a40 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
17a50 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64  _DESC .  );.#ifd
17a60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
17a70 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61    /* Confirm tha
17a80 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69  t aiMap[] contai
17a90 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67  ns nVector integ
17aa0 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  er values betwee
17ab0 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65  n 0 and.  ** nVe
17ac0 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72  ctor-1. */.  for
17ad0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
17ae0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
17af0 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63  , cnt;.    for(c
17b00 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f  nt=j=0; j<nVecto
17b10 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61  r; j++) if( aiMa
17b20 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b  p[j]==i ) cnt++;
17b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74  .    assert( cnt
17b40 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ==1 );.  }.#endi
17b50 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  f..  /* Code the
17b60 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
17b70 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
17b80 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20   (...)". If the 
17b90 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76  LHS is a .  ** v
17ba0 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69  ector, then it i
17bb0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
17bc0 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20  rray of nVector 
17bd0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
17be0 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a  ng .  ** at r1..
17bf0 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65    **.  ** sqlite
17c00 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d  3FindInIndex() m
17c10 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65  ight have reorde
17c20 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f  red the fields o
17c30 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72  f the LHS vector
17c40 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
17c50 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20  e fields are in 
17c60 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
17c70 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  s an existing in
17c80 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20  dex.   The.  ** 
17c90 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f  aiMap[] array co
17ca0 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67  ntains a mapping
17cb0 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
17cc0 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64  al LHS field ord
17cd0 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66  er to.  ** the f
17ce0 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20  ield order that 
17cf0 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20  matches the RHS 
17d00 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  index..  */.  sq
17d10 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
17d20 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 4c  sh(pParse);.  rL
17d30 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64  hsOrig = exprCod
17d40 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
17d50 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b  pLeft, &iDummy);
17d60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
17d70 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69  ector && aiMap[i
17d80 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20  ]==i; i++){} /* 
17d90 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72  Are LHS fields r
17da0 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69  eordered? */.  i
17db0 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b  f( i==nVector ){
17dc0 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c  .    /* LHS fiel
17dd0 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64  ds are not reord
17de0 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73  ered */.    rLhs
17df0 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d   = rLhsOrig;.  }
17e00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  else{.    /* Nee
17e10 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65  d to reorder the
17e20 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f   LHS fields acco
17e30 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a  rding to aiMap *
17e40 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c  /.    rLhs = sql
17e50 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
17e60 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
17e70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
17e80 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
17e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17ea0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
17eb0 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c  opy, rLhsOrig+i,
17ec0 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20   rLhs+aiMap[i], 
17ed0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
17ee0 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
17ef0 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
17f00 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
17f10 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
17f20 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
17f30 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
17f40 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
17f50 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
17f60 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
17f70 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
17f80 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  sons..  **.  ** 
17f90 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29  This is step (1)
17fa0 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61   in the in-opera
17fb0 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64  tor.md optimized
17fc0 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f   algorithm..  */
17fd0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
17fe0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20  _INDEX_NOOP ){. 
17ff0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
18000 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
18010 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ist;.    CollSeq
18020 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
18030 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
18040 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
18050 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65  t);.    int labe
18060 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lOk = sqlite3Vdb
18070 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
18080 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f     int r2, regTo
18090 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65  Free;.    int re
180a0 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  gCkNull = 0;.   
180b0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73   int ii;.    ass
180c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
180d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
180e0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
180f0 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
18100 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  !=destIfFalse ){
18110 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c  .      regCkNull
18120 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
18130 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
18140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18150 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41  ddOp3(v, OP_BitA
18160 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20  nd, rLhs, rLhs, 
18170 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
18180 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
18190 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ii<pList->nExpr;
181a0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32   ii++){.      r2
181b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
181c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
181d0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
181e0 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a  r, &regToFree);.
181f0 20 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e        if( regCkN
18200 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78  ull && sqlite3Ex
18210 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73  prCanBeNull(pLis
18220 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20  t->a[ii].pExpr) 
18230 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18240 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18250 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b  OP_BitAnd, regCk
18260 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e  Null, r2, regCkN
18270 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
18280 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74      if( ii<pList
18290 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73  ->nExpr-1 || des
182a0 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
182b0 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alse ){.        
182c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
182d0 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73  4(v, OP_Eq, rLhs
182e0 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20  , labelOk, r2,. 
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18300 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
18310 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
18320 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  Q);.        Vdbe
18330 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
18340 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  <pList->nExpr-1)
18350 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
18360 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d  verageIf(v, ii==
18370 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
18380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18390 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
183a0 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zAff[0]);.      
183b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
183c0 73 73 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c  ssert( destIfNul
183d0 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
183e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
183f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18400 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74  P_Ne, rLhs, dest
18410 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20  IfFalse, r2,.   
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18430 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
18440 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
18450 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18460 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18470 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
18480 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49  , zAff[0] | SQLI
18490 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
184a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
184b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
184c0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
184d0 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  oFree);.    }.  
184e0 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
184f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18500 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18510 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75  _IsNull, regCkNu
18520 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
18530 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18540 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18550 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
18560 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20  fFalse);.    }. 
18570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18580 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
18590 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69  belOk);.    sqli
185a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
185b0 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e  g(pParse, regCkN
185c0 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73  ull);.    goto s
185d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
185e0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a  _finished;.  }..
185f0 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65    /* Step 2: Che
18600 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
18610 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e   LHS contains an
18620 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20  y NULL columns. 
18630 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53   If the.  ** LHS
18640 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55   does contain NU
18650 4c 4c 73 20 74 68 65 6e 20 74 68 65 20 72 65 73  LLs then the res
18660 75 6c 74 20 6d 75 73 74 20 62 65 20 65 69 74 68  ult must be eith
18670 65 72 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c  er FALSE or NULL
18680 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74  ..  ** We will t
18690 68 65 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e  hen skip the bin
186a0 61 72 79 20 73 65 61 72 63 68 20 6f 66 20 74 68  ary search of th
186b0 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66  e RHS..  */.  if
186c0 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
186d0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
186e0 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
186f0 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73  tIfFalse;.  }els
18700 65 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32  e{.    destStep2
18710 20 3d 20 64 65 73 74 53 74 65 70 36 20 3d 20 73   = destStep6 = s
18720 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18730 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f  bel(v);.  }.  fo
18740 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
18750 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
18760 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
18770 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
18780 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29  pExpr->pLeft, i)
18790 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
187a0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
187b0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
187c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
187d0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b  OP_IsNull, rLhs+
187e0 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20  i, destStep2);. 
187f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18800 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
18810 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54  .  /* Step 3.  T
18820 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e  he LHS is now kn
18830 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
18840 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61  LL.  Do the bina
18850 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f  ry search.  ** o
18860 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20  f the RHS using 
18870 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f  the LHS as a pro
18880 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74  be.  If found, t
18890 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a  he result is.  *
188a0 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69  * true..  */.  i
188b0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
188c0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
188d0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
188e0 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
188f0 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
18900 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20  -tree and so we 
18910 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77  also.    ** know
18920 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73   that the RHS is
18930 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63   non-NULL.  Henc
18940 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74  e, we combine st
18950 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20  eps 3 and 4.    
18960 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ** into a single
18970 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
18980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18990 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
189a0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
189b0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
189c0 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Lhs);.    VdbeCo
189d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61  verage(v);.    a
189e0 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c  ddrTruthOp = sql
189f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
18a00 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20  , OP_Goto);  /* 
18a10 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20  Return True */. 
18a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
18a30 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
18a40 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c   OP_Affinity, rL
18a50 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20  hs, nVector, 0, 
18a60 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  zAff, nVector);.
18a70 20 20 20 20 69 66 28 20 64 65 73 74 49 66 46 61      if( destIfFa
18a80 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
18a90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62  ){.      /* Comb
18aa0 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20 53  ine Step 3 and S
18ab0 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e  tep 5 into a sin
18ac0 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  gle opcode */.  
18ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18ae0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
18af0 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  otFound, pExpr->
18b00 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
18b10 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lse,.           
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b30 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
18b40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18b50 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69  .      goto sqli
18b60 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
18b70 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
18b80 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74    /* Ordinary St
18b90 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61  ep 3, for the ca
18ba0 73 65 20 77 68 65 72 65 20 46 41 4c 53 45 20 61  se where FALSE a
18bb0 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74  nd NULL are dist
18bc0 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72  inct */.    addr
18bd0 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65  TruthOp = sqlite
18be0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
18bf0 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
18c00 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20  r->iTable, 0,.  
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f      rLhs, nVecto
18c40 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
18c50 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  (v);.  }..  /* S
18c60 74 65 70 20 34 2e 20 20 49 66 20 74 68 65 20 52  tep 4.  If the R
18c70 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  HS is known to b
18c80 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77  e non-NULL and w
18c90 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20  e did not find. 
18ca0 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20   ** an match on 
18cb0 74 68 65 20 73 65 61 72 63 68 20 61 62 6f 76 65  the search above
18cc0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
18cd0 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e  t must be FALSE.
18ce0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73  .  */.  if( rRhs
18cf0 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74  HasNull && nVect
18d00 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  or==1 ){.    sql
18d10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18d20 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52  , OP_NotNull, rR
18d30 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49  hsHasNull, destI
18d40 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62  fFalse);.    Vdb
18d50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18d60 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20  }..  /* Step 5. 
18d70 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61   If we do not ca
18d80 72 65 20 61 62 6f 75 74 20 74 68 65 20 64 69 66  re about the dif
18d90 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
18da0 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41  NULL and.  ** FA
18db0 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  LSE, then just r
18dc0 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20  eturn false. .  
18dd0 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 46  */.  if( destIfF
18de0 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
18df0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f   ) sqlite3VdbeGo
18e00 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
18e10 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36  e);..  /* Step 6
18e20 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72  : Loop through r
18e30 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20  ows of the RHS. 
18e40 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f   Compare each ro
18e50 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20  w to the LHS..  
18e60 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72  ** If any compar
18e70 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ison is NULL, th
18e80 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
18e90 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20   NULL.  If all. 
18ea0 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20   ** comparisons 
18eb0 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74  are FALSE then t
18ec0 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20  he final result 
18ed0 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20  is FALSE..  **. 
18ee0 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72   ** For a scalar
18ef0 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66 66   LHS, it is suff
18f00 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  icient to check 
18f10 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 72  just the first r
18f20 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52  ow.  ** of the R
18f30 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  HS..  */.  if( d
18f40 65 73 74 53 74 65 70 36 20 29 20 73 71 6c 69 74  estStep6 ) sqlit
18f50 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18f60 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36 29  el(v, destStep6)
18f70 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  ;.  addrTop = sq
18f80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18f90 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45  v, OP_Rewind, pE
18fa0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
18fb0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62  tIfFalse);.  Vdb
18fc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18fd0 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b  if( nVector>1 ){
18fe0 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
18ff0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19000 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65  keLabel(v);.  }e
19010 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20  lse{.    /* For 
19020 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62  nVector==1, comb
19030 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64 20  ine steps 6 and 
19040 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79  7 by immediately
19050 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a   returning.    *
19060 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 66  * FALSE if the f
19070 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  irst comparison 
19080 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20  is not NULL */. 
19090 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d     destNotNull =
190a0 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
190b0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
190c0 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
190d0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43    Expr *p;.    C
190e0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
190f0 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69     int r3 = sqli
19100 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
19110 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73  arse);.    p = s
19120 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
19130 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
19140 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  i);.    pColl = 
19150 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
19160 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
19170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19180 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
19190 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
191a0 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71  , i, r3);.    sq
191b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
191c0 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69  v, OP_Ne, rLhs+i
191d0 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72  , destNotNull, r
191e0 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
191f0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
19200 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
19210 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  Q);.    VdbeCove
19220 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
19230 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19240 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
19250 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
19260 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19270 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c  to, 0, destIfNul
19280 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  l);.  if( nVecto
19290 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
192a0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
192b0 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c  el(v, destNotNul
192c0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
192d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
192e0 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  Next, pExpr->iTa
192f0 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  ble, addrTop+1);
19300 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
19310 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74  e(v);..    /* St
19320 65 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61  ep 7:  If we rea
19330 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  ch this point, w
19340 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
19350 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20  result must.    
19360 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a  ** be false. */.
19370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19380 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
19390 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
193a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
193b0 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72  ps here in order
193c0 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e   to return true.
193d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
193e0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
193f0 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69  rTruthOp);..sqli
19400 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
19410 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c  nished:.  if( rL
19420 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73  hs!=rLhsOrig ) s
19430 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19440 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68  pReg(pParse, rLh
19450 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  s);.  sqlite3Exp
19460 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
19470 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
19480 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
19490 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70  r"));.sqlite3Exp
194a0 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
194b0 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  r:.  sqlite3DbFr
194c0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61  ee(pParse->db, a
194d0 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  iMap);.  sqlite3
194e0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
194f0 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64  b, zAff);.}.#end
19500 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
19510 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
19520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19530 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
19540 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  T./*.** Generate
19550 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
19560 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
19570 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
19580 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
19590 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
195a0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
195b0 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
195c0 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
195d0 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
195e0 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
195f0 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
19600 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
19610 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
19620 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
19630 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
19640 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
19650 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
19660 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
19670 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
19680 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
19690 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
196a0 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
196b0 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
196c0 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
196d0 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69   value;.    sqli
196e0 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
196f0 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
19700 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
19710 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
19720 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
19730 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
19740 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
19750 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
19760 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
19770 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
19780 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
19790 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
197a0 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
197b0 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
197c0 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
197d0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
197e0 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
197f0 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
19800 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
19810 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
19820 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
19830 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
19840 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e  Mem..**.** Expr.
19850 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61  u.zToken is alwa
19860 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f  ys UTF8 and zero
19870 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
19880 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
19890 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70  Integer(Parse *p
198a0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
198b0 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
198c0 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64   int iMem){.  Vd
198d0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
198e0 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78  pVdbe;.  if( pEx
198f0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
19900 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
19910 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
19920 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65  iValue;.    asse
19930 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( i>=0 );.    
19940 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
19950 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
19960 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19970 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
19980 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
19990 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34    int c;.    i64
199a0 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73   value;.    cons
199b0 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70  t char *z = pExp
199c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
199d0 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
199e0 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
199f0 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
19a00 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
19a10 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20  ( c==0 || (c==2 
19a20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  && negFlag) ){. 
19a30 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
19a40 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
19a50 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
19a60 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
19a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19a80 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
19a90 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
19aa0 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
19ab0 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
19ac0 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
19ad0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
19ae0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71  G_POINT.      sq
19af0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19b00 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64  arse, "oversized
19b10 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c   integer: %s%s",
19b20 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a   negFlag ? "-" :
19b30 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23   "", z);.#else.#
19b40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19b50 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20  IT_HEX_INTEGER. 
19b60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
19b70 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22  _strnicmp(z,"0x"
19b80 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
19b90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19ba0 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c  g(pParse, "hex l
19bb0 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20  iteral too big: 
19bc0 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d  %s", z);.      }
19bd0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
19be0 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65    {.        code
19bf0 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c  Real(v, z, negFl
19c00 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ag, iMem);.     
19c10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
19c20 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
19c30 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
19c40 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
19c50 65 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66  e consistency of
19c60 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
19c70 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
19c80 63 61 63 68 65 49 73 56 61 6c 69 64 28 50 61 72  cacheIsValid(Par
19c90 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
19ca0 6e 74 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69  nt i, n;.  for(i
19cb0 3d 6e 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  =n=0; i<SQLITE_N
19cc0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b  _COLCACHE; i++){
19cd0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
19ce0 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
19cf0 65 67 3e 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a  eg>0 ) n++;.  }.
19d00 20 20 72 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72    return n==pPar
19d10 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d  se->nColCache;.}
19d20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
19d30 6c 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74  lear a cache ent
19d40 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
19d50 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
19d60 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
19d70 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63  , struct yColCac
19d80 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  he *p){.  if( p-
19d90 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  >tempReg ){.    
19da0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
19db0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
19dc0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
19dd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
19de0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
19df0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
19e00 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
19e10 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
19e20 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65   0;.  }.  p->iRe
19e30 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
19e40 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  >nColCache--;.  
19e50 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19e60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19e70 20 7c 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64   || cacheIsValid
19e80 28 70 50 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a  (pParse) );.}...
19e90 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20  /*.** Record in 
19ea0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
19eb0 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c   that a particul
19ec0 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61  ar column from a
19ed0 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74  .** particular t
19ee0 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69  able is stored i
19ef0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
19f00 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  egister..*/.void
19f10 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19f20 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50  eStore(Parse *pP
19f30 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20  arse, int iTab, 
19f40 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52  int iCol, int iR
19f50 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
19f60 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e  int minLru;.  in
19f70 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75  t idxLru;.  stru
19f80 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
19f90 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e  ..  /* Unless an
19fa0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
19fb0 72 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75  red, register nu
19fc0 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73  mbers are always
19fd0 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20   positive. */.  
19fe0 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c  assert( iReg>0 |
19ff0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
1a000 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1a010 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1a020 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31  assert( iCol>=-1
1a030 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29   && iCol<32768 )
1a040 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c  ;  /* Finite col
1a050 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  umn numbers */..
1a060 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    /* The SQLITE_
1a070 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67  ColumnCache flag
1a080 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f   disables the co
1a090 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69  lumn cache.  Thi
1a0a0 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66  s is used.  ** f
1a0b0 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20  or testing only 
1a0c0 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  - to verify that
1a0d0 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67   SQLite always g
1a0e0 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73  ets the same ans
1a0f0 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  wer.  ** with an
1a100 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f  d without the co
1a110 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f  lumn cache..  */
1a120 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
1a130 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
1a140 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
1a150 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65  olumnCache) ) re
1a160 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  turn;..  /* Firs
1a170 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78  t replace any ex
1a180 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20  isting entry..  
1a190 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
1a1a0 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f  , the way the co
1a1b0 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75  lumn cache is cu
1a1c0 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65  rrently used, we
1a1d0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
1a1e0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62    ** that the ob
1a1f0 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  ject will never 
1a200 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61  already be in ca
1a210 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69  che.  Verify thi
1a220 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a  s guarantee..  *
1a230 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1a240 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1a250 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1a260 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1a270 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1a280 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1a290 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54  iReg==0 || p->iT
1a2a0 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d  able!=iTab || p-
1a2b0 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29  >iColumn!=iCol )
1a2c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1a2d0 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79  /* Find an empty
1a2e0 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63   slot and replac
1a2f0 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e it */.  for(i=
1a300 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1a310 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1a320 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1a330 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
1a340 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20  p->iReg==0 ){.  
1a350 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
1a360 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a370 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54  vel;.      p->iT
1a380 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
1a390 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
1a3a0 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iCol;.      p->i
1a3b0 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
1a3c0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
1a3d0 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  ;.      p->lru =
1a3e0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1a3f0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  nt++;.      pPar
1a400 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b  se->nColCache++;
1a410 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a420 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1a430 63 46 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65  cFailed || cache
1a440 49 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20  IsValid(pParse) 
1a450 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
1a460 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1a470 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73   Replace the las
1a480 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
1a490 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  */.  minLru = 0x
1a4a0 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c  7fffffff;.  idxL
1a4b0 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  ru = -1;.  for(i
1a4c0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1a4d0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
1a4e0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
1a4f0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1a500 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
1a510 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d  {.      idxLru =
1a520 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75   i;.      minLru
1a530 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d   = p->lru;.    }
1a540 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59  .  }.  if( ALWAY
1a550 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a  S(idxLru>=0) ){.
1a560 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
1a570 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
1a580 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65  u];.    p->iLeve
1a590 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
1a5a0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e  heLevel;.    p->
1a5b0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
1a5c0 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
1a5d0 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65  iCol;.    p->iRe
1a5e0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d  g = iReg;.    p-
1a5f0 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
1a600 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
1a610 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
1a620 20 20 20 20 61 73 73 65 72 74 28 20 63 61 63 68      assert( cach
1a630 65 49 73 56 61 6c 69 64 28 70 50 61 72 73 65 29  eIsValid(pParse)
1a640 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
1a650 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64    }.}../*.** Ind
1a660 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73  icate that regis
1a670 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65  ters between iRe
1a680 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61  g..iReg+nReg-1 a
1a690 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  re being overwri
1a6a0 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74  tten..** Purge t
1a6b0 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69  he range of regi
1a6c0 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63  sters from the c
1a6d0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a  olumn cache..*/.
1a6e0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1a6f0 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73  CacheRemove(Pars
1a700 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1a710 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
1a720 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1a730 68 65 20 2a 70 3b 0a 20 20 69 66 28 20 69 52 65  he *p;.  if( iRe
1a740 67 3c 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  g<=0 || pParse->
1a750 6e 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 20 72  nColCache==0 ) r
1a760 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50  eturn;.  p = &pP
1a770 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1a780 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
1a790 45 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29  E-1];.  while(1)
1a7a0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
1a7b0 67 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e  g >= iReg && p->
1a7c0 69 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67  iReg < iReg+nReg
1a7d0 20 29 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65   ) cacheEntryCle
1a7e0 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
1a7f0 20 20 20 69 66 28 20 70 3d 3d 70 50 61 72 73 65     if( p==pParse
1a800 2d 3e 61 43 6f 6c 43 61 63 68 65 20 29 20 62 72  ->aColCache ) br
1a810 65 61 6b 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20  eak;.    p--;.  
1a820 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  }.}../*.** Remem
1a830 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ber the current 
1a840 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e  column cache con
1a850 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65  text.  Any new e
1a860 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20  ntries added.** 
1a870 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c  added to the col
1a880 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20  umn cache after 
1a890 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65  this call are re
1a8a0 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  moved when the.*
1a8b0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
1a8c0 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  pop occurs..*/.v
1a8d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1a8e0 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a  achePush(Parse *
1a8f0 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
1a900 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b  e->iCacheLevel++
1a910 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a920 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
1a930 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1a940 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
1a950 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
1a960 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c  ntf("PUSH to %d\
1a970 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63  n", pParse->iCac
1a980 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65  heLevel);.  }.#e
1a990 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
1a9a0 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  move from the co
1a9b0 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65  lumn cache any e
1a9c0 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65  ntries that were
1a9d0 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65   added since the
1a9e0 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73  .** the previous
1a9f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1aa00 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e  ePush operation.
1aa10 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1aa20 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65  , restore.** the
1aa30 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74   cache to the st
1aa40 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72  ate it was in pr
1aa50 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ior the most rec
1aa60 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69  ent Push..*/.voi
1aa70 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1aa80 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61  hePop(Parse *pPa
1aa90 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rse){.  int i;. 
1aaa0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1aab0 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
1aac0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1aad0 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72  vel>=1 );.  pPar
1aae0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d  se->iCacheLevel-
1aaf0 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  -;.#ifdef SQLITE
1ab00 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1ab10 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1ab20 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1ab30 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1ab40 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64  intf("POP  to %d
1ab50 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
1ab60 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
1ab70 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c  endif.  for(i=0,
1ab80 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1ab90 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
1aba0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
1abb0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1abc0 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76  >iReg && p->iLev
1abd0 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68  el>pParse->iCach
1abe0 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  eLevel ){.      
1abf0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
1ac00 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
1ac10 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
1ac20 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
1ac30 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
1ac40 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
1ac50 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
1ac60 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
1ac70 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
1ac80 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
1ac90 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
1aca0 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
1acb0 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
1acc0 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
1acd0 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
1ace0 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
1acf0 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
1ad00 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
1ad10 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
1ad20 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
1ad30 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
1ad40 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1ad50 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
1ad60 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1ad70 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1ad80 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1ad90 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1ada0 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
1adb0 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
1adc0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
1add0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  }.  }.}../* Gene
1ade0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1adf0 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65  ill load into re
1ae00 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20  gister regOut a 
1ae10 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a  value that is.**
1ae20 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
1ae30 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20   the iIdxCol-th 
1ae40 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
1ae50 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pIdx..*/.void sq
1ae60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61  lite3ExprCodeLoa
1ae70 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20  dIndexColumn(.  
1ae80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1ae90 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1aea0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
1aeb0 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54  x *pIdx,    /* T
1aec0 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63  he index whose c
1aed0 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c  olumn is to be l
1aee0 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  oaded */.  int i
1aef0 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75  TabCur,    /* Cu
1af00 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1af10 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a   a table row */.
1af20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20    int iIdxCol,  
1af30 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1af40 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
1af50 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
1af60 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
1af70 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65  * Store the inde
1af80 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  x column value i
1af90 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1afa0 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62  */.){.  i16 iTab
1afb0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
1afc0 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20  lumn[iIdxCol];. 
1afd0 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e   if( iTabCol==XN
1afe0 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73  _EXPR ){.    ass
1aff0 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
1b000 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  xpr );.    asser
1b010 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1b020 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c  r->nExpr>iIdxCol
1b030 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
1b040 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43  iSelfTab = iTabC
1b050 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ur;.    sqlite3E
1b060 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72  xprCodeCopy(pPar
1b070 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  se, pIdx->aColEx
1b080 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70  pr->a[iIdxCol].p
1b090 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  Expr, regOut);. 
1b0a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1b0b0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1b0c0 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72  lumnOfTable(pPar
1b0d0 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d  se->pVdbe, pIdx-
1b0e0 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72  >pTable, iTabCur
1b0f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72        iTabCol, r
1b120 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1b130 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1b140 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
1b150 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
1b160 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1b170 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
1b180 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1b190 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1b1a0 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
1b1b0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1b1c0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1b1d0 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
1b1e0 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
1b1f0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1b200 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
1b210 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
1b220 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72  /* The table cur
1b230 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20  sor.  Or the PK 
1b240 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f  cursor for WITHO
1b250 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e  UT ROWID */.  in
1b260 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a  t iCol,       /*
1b270 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
1b280 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
1b290 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1b2a0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1b2b0 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
1b2c0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1b2d0 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  ){.  if( iCol<0 
1b2e0 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69  || iCol==pTab->i
1b2f0 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  PKey ){.    sqli
1b300 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b310 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43   OP_Rowid, iTabC
1b320 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ur, regOut);.  }
1b330 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
1b340 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
1b350 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
1b360 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
1b370 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20   int x = iCol;. 
1b380 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
1b390 28 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72  (pTab) && !IsVir
1b3a0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
1b3b0 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
1b3c0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c  olumnOfIndex(sql
1b3d0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
1b3e0 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29  dex(pTab), iCol)
1b3f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b400 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1b410 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c   op, iTabCur, x,
1b420 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
1b430 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
1b440 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
1b450 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
1b460 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
1b470 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1b480 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1b490 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
1b4a0 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
1b4b0 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
1b4c0 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
1b4d0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1b4e0 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
1b4f0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74  .**.** An effort
1b500 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
1b510 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
1b520 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
1b530 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  Reg.  This.** is
1b540 20 6e 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20   not garanteeed 
1b550 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20  for GetColumn() 
1b560 2d 20 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e  - the result can
1b570 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   be stored in.**
1b580 20 61 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20   any register.  
1b590 42 75 74 20 74 68 65 20 72 65 73 75 6c 74 20 69  But the result i
1b5a0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1b5b0 6c 61 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72  land in register
1b5c0 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74   iReg.** for Get
1b5d0 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a  ColumnToReg()..*
1b5e0 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
1b5f0 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
1b600 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
1b610 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
1b620 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
1b630 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
1b640 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
1b650 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
1b660 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
1b670 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b680 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1b690 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1b6a0 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
1b6b0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1b6c0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1b6d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1b6e0 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
1b6f0 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
1b700 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
1b710 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
1b720 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
1b730 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
1b740 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
1b750 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
1b760 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
1b770 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
1b780 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
1b790 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
1b7a0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
1b7b0 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20   u8 p5          
1b7c0 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f    /* P5 value fo
1b7d0 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c  r OP_Column + FL
1b7e0 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  AGS */.){.  Vdbe
1b7f0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1b800 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1b810 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1b820 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c   *p;..  for(i=0,
1b830 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1b840 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
1b850 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
1b860 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1b870 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54  >iReg>0 && p->iT
1b880 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
1b890 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  p->iColumn==iCol
1b8a0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  umn ){.      p->
1b8b0 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
1b8c0 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20  acheCnt++;.     
1b8d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b8e0 65 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61  ePinRegister(pPa
1b8f0 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20  rse, p->iReg);. 
1b900 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
1b910 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  Reg;.    }.  }  
1b920 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1b930 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1b940 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1b950 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54  able(v, pTab, iT
1b960 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1b970 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29  Reg);.  if( p5 )
1b980 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b990 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29  eChangeP5(v, p5)
1b9a0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20  ;.  }else{   .  
1b9b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1b9c0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1b9d0 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
1b9e0 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65   iReg);.  }.  re
1b9f0 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69  turn iReg;.}.voi
1ba00 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1ba10 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28  eGetColumnToReg(
1ba20 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ba30 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1ba40 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1ba50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ba60 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1ba70 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1ba80 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1ba90 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1baa0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1bab0 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1bac0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1bad0 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1bae0 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1baf0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1bb00 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1bb10 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
1bb20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1bb30 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1bb40 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
1bb50 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1bb60 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
1bb70 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c  , iColumn, iTabl
1bb80 65 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69  e, iReg, 0);.  i
1bb90 66 28 20 72 31 21 3d 69 52 65 67 20 29 20 73 71  f( r1!=iReg ) sq
1bba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bbb0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1bbc0 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65  P_SCopy, r1, iRe
1bbd0 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  g);.}.../*.** Cl
1bbe0 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
1bbf0 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
1bc00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1bc10 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
1bc20 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
1bc30 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
1bc40 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66  olCache *p;..#if
1bc50 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1bc60 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
1bc70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
1bc80 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
1bc90 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45  .    printf("CLE
1bca0 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  AR\n");.  }.#end
1bcb0 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
1bcc0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1bcd0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
1bce0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
1bcf0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
1bd00 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  eg ){.      cach
1bd10 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
1bd20 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
1bd30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  }.}../*.** Recor
1bd40 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1bd50 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  an affinity chan
1bd60 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  ge has occurred 
1bd70 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67  on iCount.** reg
1bd80 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
1bd90 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a  with iStart..*/.
1bda0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1bdb0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1bdc0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
1bdd0 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  e, int iStart, i
1bde0 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71  nt iCount){.  sq
1bdf0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1be00 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74  move(pParse, iSt
1be10 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a  art, iCount);.}.
1be20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1be30 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
1be40 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
1be50 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
1be60 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
1be70 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
1be80 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f  g-1. Keep the co
1be90 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f  lumn cache up-to
1bea0 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -date..*/.void s
1beb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1bec0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1bed0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
1bee0 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
1bef0 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
1bf00 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
1bf10 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
1bf20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1bf30 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
1bf40 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
1bf50 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
1bf60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1bf70 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1bf80 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d   iFrom, nReg);.}
1bf90 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1bfa0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1bfb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
1bfc0 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a  VERAGE_TEST)./*.
1bfd0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1bfe0 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
1bff0 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
1c000 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
1c010 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
1c020 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
1c030 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  umn cache..**.**
1c040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1c050 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73   used within ass
1c060 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61  ert() and testca
1c070 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79  se() macros only
1c080 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  .** and does not
1c090 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72   appear in a nor
1c0a0 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  mal build..*/.st
1c0b0 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
1c0c0 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
1c0d0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
1c0e0 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
1c0f0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1c100 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1c110 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1c120 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1c130 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1c140 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1c150 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
1c160 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
1c170 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29  From && r<=iTo )
1c180 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a   return 1;    /*
1c190 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20  NO_TEST*/.  }.  
1c1a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1c1b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
1c1c0 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56  UG || SQLITE_COV
1c1d0 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  ERAGE_TEST */...
1c1e0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1c1f0 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
1c200 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52  n node to a TK_R
1c210 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e 63  EGISTER referenc
1c220 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ing.** register 
1c230 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65  iReg.  The calle
1c240 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
1c250 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79 20  at iReg already 
1c260 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
1c270 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1c280 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
1c290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c2a0 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
1c2b0 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65  Expr *p, int iRe
1c2c0 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70  g){.  p->op2 = p
1c2d0 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20  ->op;.  p->op = 
1c2e0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70  TK_REGISTER;.  p
1c2f0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b  ->iTable = iReg;
1c300 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70  .  ExprClearProp
1c310 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29  erty(p, EP_Skip)
1c320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75  ;.}../*.** Evalu
1c330 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
1c340 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63 74  n (either a vect
1c350 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65  or or a scalar e
1c360 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73  xpression) and s
1c370 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75  tore.** the resu
1c380 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75  lt in continguou
1c390 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1c3a0 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74  sters.  Return t
1c3b0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
1c3c0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
1c3d0 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  r used to store 
1c3e0 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
1c3f0 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65  * If the returne
1c400 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1c410 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
1c420 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c   scalar, then al
1c430 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74  so write.** that
1c440 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1c450 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c   into *piFreeabl
1c460 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  e.  If the retur
1c470 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73  ned result regis
1c480 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20  ter.** is not a 
1c490 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20  temporary or if 
1c4a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1c4b0 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a  s a vector set *
1c4c0 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f  piFreeable.** to
1c4d0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
1c4e0 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  t exprCodeVector
1c4f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c500 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69  Expr *p, int *pi
1c510 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74  Freeable){.  int
1c520 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20   iResult;.  int 
1c530 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  nResult = sqlite
1c540 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
1c550 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c  p);.  if( nResul
1c560 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73  t==1 ){.    iRes
1c570 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1c580 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1c590 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29  , p, piFreeable)
1c5a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
1c5b0 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a  piFreeable = 0;.
1c5c0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
1c5d0 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
1c5e0 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1c5f0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
1c600 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30  (pParse, p, 0, 0
1c610 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c620 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1c630 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73   iResult = pPars
1c640 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
1c650 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1c660 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20   nResult;.      
1c670 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
1c680 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  lt; i++){.      
1c690 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c6a0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70  e(pParse, p->x.p
1c6b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1c6c0 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20  , i+iResult);.  
1c6d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c6e0 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74    return iResult
1c6f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
1c700 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
1c710 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
1c720 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1c730 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
1c740 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
1c750 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1c760 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
1c770 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
1c780 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
1c790 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
1c7a0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
1c7b0 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
1c7c0 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
1c7d0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
1c7e0 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
1c7f0 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
1c800 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
1c810 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
1c820 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
1c830 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
1c840 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1c850 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
1c860 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
1c870 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
1c880 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
1c890 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
1c8a0 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
1c8b0 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
1c8c0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1c8d0 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
1c8e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c8f0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1c900 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1c910 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
1c920 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
1c930 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1c940 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1c950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c960 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
1c970 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
1c980 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
1c990 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
1c9a0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1c9b0 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
1c9c0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
1c9d0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
1c9e0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
1c9f0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1ca00 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
1ca10 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
1ca20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1ca30 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1ca40 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1ca50 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20    int r1, r2;   
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1ca70 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
1ca80 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c  numbers */.  sql
1ca90 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1caa0 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
1cab0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1cac0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  n */.  Expr temp
1cad0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1cae0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
1caf0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
1cb00 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a  .  int p5 = 0;..
1cb10 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1cb20 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
1cb30 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
1cb40 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
1cb50 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1cb60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1cb70 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
1cb80 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78  ;.  }..  if( pEx
1cb90 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
1cba0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
1cbb0 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
1cbc0 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
1cbd0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1cbe0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
1cbf0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
1cc00 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
1cc10 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
1cc20 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
1cc30 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
1cc40 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
1cc50 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
1cc60 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
1cc70 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1cc80 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1cc90 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
1cca0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1ccb0 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
1ccc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ccd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
1cce0 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
1ccf0 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
1cd00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cd10 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1cd20 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
1cd30 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1cd60 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
1cd70 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
1cd80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1cd90 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
1cda0 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
1cdb0 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
1cdc0 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
1cdd0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1cde0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
1cdf0 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
1ce00 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  e;.      if( iTa
1ce10 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  b<0 ){.        i
1ce20 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73  f( pParse->ckBas
1ce30 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1ce40 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43   /* Generating C
1ce50 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
1ce60 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   or inserting in
1ce70 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78  to partial index
1ce80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
1ce90 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
1cea0 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
1ceb0 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  kBase;.         
1cec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1ced0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1cee0 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78   /* Coding an ex
1cef0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
1cf00 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65   part of an inde
1cf10 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e  x where column n
1cf20 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ames.          *
1cf30 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72  * in the index r
1cf40 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c  efer to the tabl
1cf50 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69  e to which the i
1cf60 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  ndex belongs */.
1cf70 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d            iTab =
1cf80 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1cf90 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  b;.        }.   
1cfa0 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
1cfb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1cfc0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1cfd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
1cfe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1d010 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
1d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1d040 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20  pr->op2);.      
1d050 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1d060 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
1d070 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
1d080 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
1d090 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
1d0a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d0b0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1d0c0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1d0d0 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
1d0e0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
1d0f0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1d100 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d110 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1d120 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
1d130 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
1d140 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
1d150 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d160 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1d170 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1d180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1d190 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d1a0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1d1b0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
1d1c0 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1d1d0 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45  ng(v, target, pE
1d1e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1d1f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d200 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1d210 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
1d220 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d230 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1d240 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
1d250 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1d260 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
1d270 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
1d280 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
1d290 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
1d2a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
1d2b0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
1d2c0 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
1d2d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1d2e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1d2f0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1d300 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1d310 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
1d320 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
1d330 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
1d340 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1d350 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
1d360 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
1d370 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
1d380 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
1d390 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1d3a0 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
1d3b0 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
1d3c0 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
1d3d0 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
1d3e0 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
1d3f0 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
1d400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d410 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
1d420 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
1d430 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
1d440 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
1d450 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1d460 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
1d470 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
1d480 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1d490 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1d4a0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1d4b0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1d4c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
1d4d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d4e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1d4f0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
1d500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d510 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
1d520 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1d530 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1d540 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
1d550 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
1d560 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1d570 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1d580 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '?' .           
1d590 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70    || strcmp(pExp
1d5a0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61  r->u.zToken, pPa
1d5b0 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
1d5c0 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30  ->iColumn-1])==0
1d5d0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1d5e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1d5f0 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61  v, -1, pParse->a
1d600 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
1d610 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49  umn-1], P4_STATI
1d620 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
1d630 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1d640 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
1d650 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  TER: {.      inR
1d660 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  eg = pExpr->iTab
1d670 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  le;.      break;
1d680 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1d690 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1d6a0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1d6b0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1d6c0 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1d6d0 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1d6e0 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1d6f0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1d700 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1d710 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1d720 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1d730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1d740 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1d750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d760 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1d770 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1d780 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
1d790 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1d7a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d7b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d7c0 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
1d7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d7e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d7f0 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1d800 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
1d810 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d820 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
1d830 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
1d840 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
1d850 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d860 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1d870 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
1d880 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
1d890 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1d8a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
1d8b0 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
1d8c0 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1d8d0 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
1d8e0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
1d8f0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
1d900 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c  ;.      p5 = SQL
1d910 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
1d920 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67    /* fall-throug
1d930 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
1d940 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1d950 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1d960 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1d970 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1d980 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1d990 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  _EQ: {.      Exp
1d9a0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1d9b0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69  ->pLeft;.      i
1d9c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1d9d0 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b  Vector(pLeft) ){
1d9e0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63  .        codeVec
1d9f0 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  torCompare(pPars
1da00 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1da10 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20  , op, p5);.     
1da20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1da30 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1da40 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1da50 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
1da60 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
1da70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1da80 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1da90 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1daa0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1dab0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1dac0 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  se, pLeft, pExpr
1dad0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1dae0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1daf0 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
1db00 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20  STOREP2 | p5);. 
1db10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1db20 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
1db30 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
1db40 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1db50 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
1db60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1db70 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
1db80 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
1db90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dba0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
1dbb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dbc0 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1dbd0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1dbe0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dbf0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1dc00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dc10 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
1dc20 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
1dc30 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dc40 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
1dc50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dc60 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1dc70 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1dc80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dc90 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1dca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dcb0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1dcc0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1dcd0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dce0 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1dcf0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1dd00 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1dd10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1dd20 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1dd30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1dd40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dd50 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
1dd60 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
1dd70 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
1dd80 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1dd90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
1dda0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1ddb0 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
1ddc0 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
1ddd0 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
1dde0 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
1ddf0 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
1de00 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
1de10 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
1de20 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
1de30 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
1de40 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20  ND==OP_And );   
1de50 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1de60 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
1de70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1de80 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20  K_OR==OP_Or );  
1de90 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1dea0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20  case( op==TK_OR 
1deb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1dec0 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
1ded0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65   );           te
1dee0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50  stcase( op==TK_P
1def0 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  LUS );.      ass
1df00 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
1df10 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20  P_Subtract );   
1df20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1df30 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
1df40 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
1df50 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
1df60 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1df70 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
1df80 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1df90 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
1dfa0 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  d );      testca
1dfb0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
1dfc0 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1dfd0 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
1dfe0 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20  BitOr );        
1dff0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e000 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
1e010 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48  assert( TK_SLASH
1e020 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20  ==OP_Divide );  
1e030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e040 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
1e050 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e060 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  LSHIFT==OP_Shift
1e070 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61  Left );   testca
1e080 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
1e090 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1e0a0 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
1e0b0 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20  _ShiftRight );  
1e0c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e0d0 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
1e0e0 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
1e0f0 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
1e100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e110 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
1e120 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e130 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e140 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e150 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e160 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1e170 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e180 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e190 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1e1a0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1e1b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1e1c0 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
1e1d0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1e1e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e1f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e200 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1e210 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e220 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e230 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
1e240 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1e250 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1e260 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
1e270 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
1e280 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
1e290 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
1e2a0 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1e2b0 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  e, pLeft, 1, tar
1e2c0 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  get);.#ifndef SQ
1e2d0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1e2e0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d  NG_POINT.      }
1e2f0 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
1e300 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
1e310 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e320 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e330 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1e340 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1e350 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
1e360 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
1e370 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a  target);.#endif.
1e380 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e390 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20       tempX.op = 
1e3a0 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
1e3b0 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20      tempX.flags 
1e3c0 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
1e3d0 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
1e3e0 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c      tempX.u.iVal
1e3f0 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ue = 0;.        
1e400 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e410 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e420 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
1e430 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1e440 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e450 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e460 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1e470 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1e480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e490 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
1e4a0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1e4b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1e4c0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1e4d0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1e4e0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1e4f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e500 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e510 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
1e520 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1e530 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1e540 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
1e550 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1e560 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
1e570 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e580 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
1e590 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e5a0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
1e5b0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e5c0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e5d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e5e0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e5f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e600 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e610 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
1e620 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  get;.      sqlit
1e630 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e640 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a  op, r1, inReg);.
1e650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e660 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1e670 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1e680 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1e690 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
1e6a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
1e6b0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
1e6c0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1e6d0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1e6e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e6f0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1e700 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
1e710 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1e720 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
1e730 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e740 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
1e750 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
1e760 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e770 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e780 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1e790 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
1e7a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e7b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
1e7c0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1e7d0 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
1e7e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1e7f0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1e800 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
1e810 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e820 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
1e830 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1e840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e850 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
1e860 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
1e870 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1e880 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
1e890 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e8a0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
1e8b0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1e8c0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
1e8d0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1e8e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
1e8f0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
1e900 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1e910 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e920 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1e930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1e940 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1e950 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
1e960 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
1e970 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1e980 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e990 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66      inReg = pInf
1e9a0 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
1e9b0 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
1e9c0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1e9d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e9e0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
1e9f0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1ea00 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
1ea10 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
1ea20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1ea30 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
1ea40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ea50 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
1ea60 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1ea70 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
1ea80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1ea90 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
1eaa0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
1eab0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1eac0 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
1ead0 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
1eae0 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
1eaf0 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
1eb00 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
1eb10 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
1eb20 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
1eb30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1eb60 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
1eb70 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
1eb80 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
1eb90 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
1eba0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
1ebb0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
1ebc0 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
1ebd0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1ebe0 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  nce */..      as
1ebf0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ec00 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ec10 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1ec20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1ec30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ec40 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1ec50 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1ec60 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1ec70 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1ec80 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1ec90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1eca0 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
1ecb0 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
1ecc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1ecd0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ece0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1ecf0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
1ed00 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1ed10 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  en;.      pDef =
1ed20 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1ed30 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46  tion(db, zId, nF
1ed40 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69  arg, enc, 0);.#i
1ed50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ed60 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46  LE_UNKNOWN_SQL_F
1ed70 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  UNCTION.      if
1ed80 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61  ( pDef==0 && pPa
1ed90 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
1eda0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
1edb0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1edc0 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22  on(db, "unknown"
1edd0 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
1ede0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1edf0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
1ee00 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e  =0 || pDef->xFin
1ee10 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
1ee20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1ee30 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1ee40 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
1ee50 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20  s()", zId);.    
1ee60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ee70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
1ee80 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
1ee90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1eea0 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
1eeb0 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
1eec0 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
1eed0 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
1eee0 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
1eef0 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a  y evaluation of.
1ef00 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
1ef10 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
1ef20 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
1ef30 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
1ef40 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
1ef50 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1ef60 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29  _FUNC_COALESCE )
1ef70 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e  {.        int en
1ef80 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69  dCoalesce = sqli
1ef90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1efa0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  (v);.        ass
1efb0 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b  ert( nFarg>=2 );
1efc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1efd0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1efe0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1eff0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1f000 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
1f010 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
1f020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f030 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1f040 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20  otNull, target, 
1f050 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
1f060 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1f070 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1f080 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f090 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1f0a0 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20  , target, 1);.  
1f0b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f0c0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1f0d0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
1f0e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1f0f0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1f100 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
1f110 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
1f120 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f130 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1f140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1f150 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1f160 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65  abel(v, endCoale
1f170 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  sce);.        br
1f180 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
1f190 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b      /* The UNLIK
1f1a0 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ELY() function i
1f1b0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20  s a no-op.  The 
1f1c0 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61  result is the va
1f1d0 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lue.      ** of 
1f1e0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1f1f0 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
1f200 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
1f210 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
1f220 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
1f230 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f240 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20   nFarg>=1 );.   
1f250 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
1f260 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1f270 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  et(pParse, pFarg
1f280 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
1f290 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
1f2a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1f2b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1f2c0 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
1f2d0 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
1f2e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
1f2f0 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
1f300 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
1f310 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f320 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
1f330 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
1f340 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20   MASKBIT32(i);. 
1f350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f360 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
1f370 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1f380 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
1f390 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
1f3a0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1f3b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1f3c0 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
1f3d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1f3e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f3f0 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
1f400 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1f410 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20  constMask ){.   
1f420 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72         r1 = pPar
1f430 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1f440 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1f450 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20  em += nFarg;.   
1f460 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f470 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f480 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1f490 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
1f4a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1f4b0 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28    /* For length(
1f4c0 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66  ) and typeof() f
1f4d0 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20  unctions with a 
1f4e0 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c  column argument,
1f4f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
1f500 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
1f510 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d   to the OP_Colum
1f520 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c  n opcode to OPFL
1f530 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20  AG_LENGTHARG.   
1f540 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41       ** or OPFLA
1f550 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70  G_TYPEOFARG resp
1f560 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f  ectively, to avo
1f570 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64  id unnecessary d
1f580 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ata.        ** l
1f590 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  oading..        
1f5a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
1f5b0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1f5c0 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
1f5d0 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
1f5e0 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
1f5f0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
1f600 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
1f610 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
1f620 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
1f630 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
1f640 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
1f650 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
1f660 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1f670 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
1f680 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
1f690 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
1f6a0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
1f6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f6c0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
1f6d0 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
1f6e0 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f700 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
1f710 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
1f720 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
1f730 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f740 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
1f750 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  s & OPFLAG_LENGT
1f760 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
1f770 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e      pFarg->a[0].
1f780 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20  pExpr->op2 = .  
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1f7b0 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
1f7c0 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
1f7d0 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
1f7e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
1f7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f800 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1f810 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  e);     /* Ticke
1f820 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
1f830 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1f840 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1f850 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
1f860 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   r1, 0,.        
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
1f890 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45  CEL_DUP|SQLITE_E
1f8a0 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20  CEL_FACTOR);.   
1f8b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f8c0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1f8d0 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  ;      /* Ticket
1f8e0 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
1f8f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f900 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
1f910 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1f920 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1f930 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
1f940 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
1f950 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
1f960 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
1f970 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
1f980 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
1f990 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
1f9a0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
1f9b0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
1f9c0 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
1f9d0 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
1f9e0 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
1f9f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
1fa00 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
1fa10 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
1fa20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
1fa30 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1fa40 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
1fa50 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
1fa60 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
1fa70 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
1fa80 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
1fa90 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
1faa0 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
1fab0 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
1fac0 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
1fad0 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
1fae0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1faf0 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
1fb00 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
1fb10 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1fb20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
1fb30 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
1fb40 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
1fb50 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
1fb60 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
1fb70 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
1fb80 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
1fb90 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
1fba0 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
1fbb0 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
1fbc0 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
1fbd0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
1fbe0 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
1fbf0 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
1fc00 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
1fc10 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
1fc20 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
1fc30 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
1fc40 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
1fc50 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
1fc60 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
1fc70 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
1fc80 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
1fc90 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
1fca0 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
1fcb0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1fcc0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1fcd0 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
1fce0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1fcf0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
1fd00 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
1fd10 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
1fd20 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
1fd30 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
1fd40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1fd50 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
1fd60 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
1fd70 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1fd80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1fd90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1fda0 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30  (v, OP_Function0
1fdb0 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
1fdc0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
1fdf0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
1fe00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1fe10 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
1fe20 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46  g);.      if( nF
1fe30 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b  arg && constMask
1fe40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1fe50 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1fe60 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
1fe70 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
1fe80 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1fe90 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1fea0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1feb0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
1fec0 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
1fed0 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
1fee0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
1fef0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ff00 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
1ff10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ff20 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
1ff30 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
1ff40 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20  SELECT && (nCol 
1ff50 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
1ff60 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
1ff70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  r)!=1 ){.       
1ff80 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
1ff90 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e  tError(pParse, n
1ffa0 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Col, 1);.      }
1ffb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1ffc0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  Reg = sqlite3Cod
1ffd0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
1ffe0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
1fff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
20000 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20010 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43  case TK_SELECT_C
20020 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
20030 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  f( pExpr->pLeft-
20040 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20  >iTable==0 ){.  
20050 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
20060 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c  ft->iTable = sql
20070 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
20080 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
20090 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20  >pLeft, 0, 0);. 
200a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
200b0 65 67 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  eg = pExpr->pLef
200c0 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70  t->iTable + pExp
200d0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
200e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
200f0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
20100 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
20110 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
20120 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20130 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
20140 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
20150 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20160 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20170 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20180 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
20190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
201a0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
201b0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
201c0 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
201d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
201e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
201f0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
20200 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
20210 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
20220 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
20230 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
20240 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20250 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
20260 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
20270 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
20280 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
20290 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
202a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
202b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
202c0 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
202d0 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
202e0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
202f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
20300 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
20310 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
20320 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
20330 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
20340 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
20350 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
20360 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
20370 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
20380 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
20390 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
203a0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
203b0 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
203c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
203d0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
203e0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
203f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20400 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20  target, 0, 0);. 
20410 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20420 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50  }.    case TK_SP
20430 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AN:.    case TK_
20440 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61  COLLATE: .    ca
20450 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
20460 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
20470 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
20480 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
20490 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
204a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
204b0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
204c0 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
204d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63     /* If the opc
204e0 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45  ode is TK_TRIGGE
204f0 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  R, then the expr
20500 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65  ession is a refe
20510 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  rence.      ** t
20520 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  o a column in th
20530 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  e new.* or old.*
20540 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61   pseudo-tables a
20550 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20  vailable to.    
20560 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
20570 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63  grams. In this c
20580 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20  ase Expr.iTable 
20590 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
205a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77  the.      ** new
205b0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
205c0 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c   or 0 for the ol
205d0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
205e0 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20  . Expr.iColumn. 
205f0 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
20600 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  o the column of 
20610 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
20620 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20   to read, or to 
20630 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  -1 to.      ** r
20640 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69  ead the rowid fi
20650 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eld..      **.  
20660 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
20670 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ssion is impleme
20680 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50  nted using an OP
20690 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54  _Param opcode. T
206a0 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70  he p1.      ** p
206b0 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
206c0 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e  to 0 for an old.
206d0 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
206e0 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20   or to (i+1).   
206f0 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e     ** to referen
20700 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d  ce another colum
20710 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70  n of the old.* p
20720 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65  seudo-table, whe
20730 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69  re .      ** i i
20740 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
20750 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61  he column. For a
20760 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72   new.rowid refer
20770 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20  ence, p1 is.    
20780 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31    ** set to (n+1
20790 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68  ), where n is th
207a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
207b0 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75  mns in each pseu
207c0 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  do-table..      
207d0 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e  ** For a referen
207e0 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ce to any other 
207f0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
20800 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
20810 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73  , p1.      ** is
20820 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c   set to (n+2+i),
20830 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61   where n and i a
20840 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72  re as defined pr
20850 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20  eviously. For.  
20860 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20      ** example, 
20870 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  if the table on 
20880 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61  which triggers a
20890 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69  re being fired i
208a0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61  s.      ** decla
208b0 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  red as:.      **
208c0 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41  .      **   CREA
208d0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
208e0 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  );.      **.    
208f0 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20    ** Then p1 is 
20900 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
20910 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
20920 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
20930 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f  0   ->    old.ro
20940 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20  wid     p1==3   
20950 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a  ->    new.rowid.
20960 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31        **   p1==1
20970 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20     ->    old.a  
20980 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d         p1==4   -
20990 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20  >    new.a.     
209a0 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e   **   p1==2   ->
209b0 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20      old.b       
209c0 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20    p1==5   ->    
209d0 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20  new.b       .   
209e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
209f0 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
20a00 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  >pTab;.      int
20a10 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
20a20 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
20a30 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
20a40 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
20a50 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
20a60 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
20a70 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
20a80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20a90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
20aa0 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
20ab0 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
20ac0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20ad0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
20ae0 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
20af0 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
20b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20b10 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
20b20 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
20b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20b40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
20b50 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
20b60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
20b70 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d  ent((v, "%s.%s -
20b80 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20  > $%d",.        
20b90 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f  (pExpr->iTable ?
20ba0 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c   "new" : "old"),
20bb0 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
20bc0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f  >iColumn<0 ? "ro
20bd0 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54  wid" : pExpr->pT
20be0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
20bf0 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c  iColumn].zName),
20c00 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a  .        target.
20c10 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
20c20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
20c30 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
20c40 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
20c50 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
20c60 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
20c70 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
20c80 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
20c90 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
20ca0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
20cb0 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
20cc0 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20  s really real.. 
20cd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20ce0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
20cf0 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69  60985-57662 SQLi
20d00 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  te will convert 
20d10 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74  the value back t
20d20 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74  o.      ** float
20d30 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65  ing point when e
20d40 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f  xtracting it fro
20d50 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a  m the record.  *
20d60 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
20d70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
20d80 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
20d90 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
20da0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
20db0 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
20dc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
20dd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
20de0 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
20df0 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
20e00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20e10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20e20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
20e30 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
20e40 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20e50 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
20e60 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
20e70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20e80 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
20e90 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
20ea0 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
20eb0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
20ec0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
20ed0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
20ee0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
20ef0 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
20f00 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
20f10 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
20f20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
20f30 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
20f40 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
20f50 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
20f60 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
20f70 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
20f80 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
20f90 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
20fa0 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
20fb0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
20fc0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
20fd0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
20fe0 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
20ff0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
21000 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
21010 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
21020 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
21030 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20   ** Y is in the 
21040 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  last element of 
21050 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69  pExpr->x.pList i
21060 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
21070 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a  ->nExpr is.    *
21080 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73  * odd.  The Y is
21090 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20   also optional. 
210a0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
210b0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e  f elements in x.
210c0 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20  pList.    ** is 
210d0 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20  even, then Y is 
210e0 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20  omitted and the 
210f0 22 6f 74 68 65 72 77 69 73 65 22 20 72 65 73 75  "otherwise" resu
21100 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20  lt is NULL..    
21110 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70  ** Ei is in pExp
21120 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d  r->pList->a[i*2]
21130 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72   and Ri is pExpr
21140 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31  ->pList->a[i*2+1
21150 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ]..    **.    **
21160 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
21170 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
21180 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20   the Ri for the 
21190 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45  first matching E
211a0 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  i,.    ** or if 
211b0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
211c0 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53  hing Ei, the ELS
211d0 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20  E term Y, or if 
211e0 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20  there is.    ** 
211f0 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55  no ELSE term, NU
21200 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LL..    */.    d
21210 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
21220 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b  op==TK_CASE ); {
21230 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61  .      int endLa
21240 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
21250 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
21260 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f   label for end o
21270 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20  f CASE stmt */. 
21280 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73       int nextCas
21290 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
212a0 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
212b0 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48  abel for next WH
212c0 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
212d0 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20     int nExpr;   
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65       /* 2x numbe
21300 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  r of WHEN terms 
21310 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21340 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21350 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
21360 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
21370 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
21380 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
21390 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
213a0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
213b0 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  elem;  /* Array 
213c0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
213d0 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f  .      Expr opCo
213e0 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20  mpare;          
213f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21400 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e  X==Ei expression
21410 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
21420 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
21430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21440 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
21450 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
21460 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
21470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
21480 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
21490 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
214a0 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e   */.      VVA_ON
214b0 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65  LY( int iCacheLe
214c0 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
214d0 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20  acheLevel; )..  
214e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
214f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
21500 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
21510 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ) && pExpr->x.pL
21520 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ist );.      ass
21530 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ert(pExpr->x.pLi
21540 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
21550 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
21560 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
21570 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
21580 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
21590 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
215a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
215b0 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  ndLabel = sqlite
215c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
215d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
215e0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
215f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74  !=0 ){.        t
21600 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20  empX = *pX;.    
21610 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
21620 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
21630 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 54  );.        exprT
21640 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d 70 58  oRegister(&tempX
21650 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  , exprCodeVector
21660 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c  (pParse, &tempX,
21670 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
21680 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21690 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
216a0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f         memset(&o
216b0 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a  pCompare, 0, siz
216c0 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b  eof(opCompare));
216d0 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
216e0 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20  re.op = TK_EQ;. 
216f0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
21700 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b  .pLeft = &tempX;
21710 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d  .        pTest =
21720 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20   &opCompare;.   
21730 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62       /* Ticket b
21740 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65  351d95f9cd5ef17e
21750 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31  9d9dbae18f5ca861
21760 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20  1190001:.       
21770 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e   ** The value in
21780 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20   regFree1 might 
21790 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74  get SCopy-ed int
217a0 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c  o the file resul
217b0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  t..        ** So
217c0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
217d0 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67  the regFree1 reg
217e0 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75  ister is not reu
217f0 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20  sed for other.  
21800 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65        ** purpose
21810 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f  s and possibly o
21820 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a  verwritten.  */.
21830 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
21840 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
21850 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
21860 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a  Expr-1; i=i+2){.
21870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21880 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
21890 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
218a0 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pX ){.        
218b0 20 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21    assert( pTest!
218c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
218d0 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74  opCompare.pRight
218e0 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
218f0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
21900 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21910 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65  pTest = aListele
21920 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
21930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65      }.        ne
21940 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33  xtCase = sqlite3
21950 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
21960 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
21970 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54  se( pTest->op==T
21980 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
21990 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
219a0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
219b0 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20  Test, nextCase, 
219c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
219d0 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  L);.        test
219e0 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
219f0 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
21a00 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
21a10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21a20 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
21a30 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
21a40 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
21a50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
21a60 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  oto(v, endLabel)
21a70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21a80 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
21a90 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
21aa0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
21ab0 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61  eLabel(v, nextCa
21ac0 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
21ad0 20 20 20 69 66 28 20 28 6e 45 78 70 72 26 31 29     if( (nExpr&1)
21ae0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
21af0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
21b00 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
21b10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21b20 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
21b30 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e  ist->a[nExpr-1].
21b40 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
21b50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21b60 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
21b70 73 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  se);.      }else
21b80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21b90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21ba0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
21bb0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
21bc0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
21bd0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
21be0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20  arse->nErr>0 .  
21bf0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
21c00 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
21c10 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a  =iCacheLevel );.
21c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21c30 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21c40 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
21c50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
21c60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21c70 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
21c80 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
21c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
21ca0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
21cb0 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
21cc0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
21cd0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
21ce0 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
21cf0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
21d00 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
21d10 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
21d20 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
21d30 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
21d40 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
21d50 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
21d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
21d70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d90 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
21da0 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
21db0 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
21dc0 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
21dd0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21de0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21df0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
21e00 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
21e10 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
21e20 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
21e30 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
21e40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
21e50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
21e60 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
21e70 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
21e80 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
21e90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21ea0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
21eb0 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
21ec0 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
21ed0 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
21ee0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
21ef0 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
21f00 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
21f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21f20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
21f30 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
21f40 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
21f50 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f70 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21f80 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
21f90 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29  >u.zToken, 0, 0)
21fa0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
21fb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
21fc0 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
21fd0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
21fe0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
21ff0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
22000 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
22010 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
22020 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
22030 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f  ../*.** Factor o
22040 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74  ut the code of t
22050 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
22060 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ion to initializ
22070 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
22080 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
22090 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72  odeAtInit(.  Par
220a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
220b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
220c0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
220d0 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
220e0 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f  expression to co
220f0 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45  de when the VDBE
22100 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a   initializes */.
22110 20 20 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20    int regDest,  
22120 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
22130 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
22140 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20  egister */.  u8 
22150 72 65 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f  reusable       /
22160 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 65  * True if this e
22170 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75  xpression is reu
22180 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  sable */.){.  Ex
22190 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
221a0 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
221b0 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
221c0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
221d0 73 74 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20  stExpr;.  pExpr 
221e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
221f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
22200 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71  pr, 0);.  p = sq
22210 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
22220 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70  end(pParse, p, p
22230 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29  Expr);.  if( p )
22240 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78  {.     struct Ex
22250 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
22260 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
22270 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74  xpr-1];.     pIt
22280 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
22290 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20  Reg = regDest;. 
222a0 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61      pItem->reusa
222b0 62 6c 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a  ble = reusable;.
222c0 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43    }.  pParse->pC
222d0 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a  onstExpr = p;.}.
222e0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
222f0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
22300 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
22310 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
22320 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
22330 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
22340 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
22350 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
22360 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
22370 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
22380 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
22390 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
223a0 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
223b0 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
223c0 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
223d0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
223e0 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
223f0 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
22400 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
22410 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
22420 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  to zero..**.** I
22430 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
22440 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
22450 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67   routine might g
22460 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20  enerate this.** 
22470 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  code to fill the
22480 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
22490 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
224a0 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  section of the.*
224b0 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20  * VDBE program, 
224c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74  in order to fact
224d0 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65  or it out of the
224e0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70   evaluation loop
224f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22500 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
22510 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
22520 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
22530 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20  eg){.  int r2;. 
22540 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
22550 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
22560 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f  pExpr);.  if( Co
22570 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
22580 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  se).   && pExpr-
22590 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
225a0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
225b0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
225c0 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a  oin(pExpr).  ){.
225d0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20      ExprList *p 
225e0 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
225f0 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Expr;.    int i;
22600 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b  .    *pReg  = 0;
22610 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
22620 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
22630 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
22640 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d  .      for(pItem
22650 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70  =p->a, i=p->nExp
22660 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c  r; i>0; pItem++,
22670 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69   i--){.        i
22680 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62  f( pItem->reusab
22690 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  le && sqlite3Exp
226a0 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
226b0 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d  pExpr,pExpr,-1)=
226c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
226d0 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
226e0 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
226f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22700 0a 20 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20  .    }.    r2 = 
22710 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22720 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22730 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
22740 2c 20 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b  , pExpr, r2, 1);
22750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
22760 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
22770 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
22780 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
22790 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
227a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
227b0 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d  r1);.    if( r2=
227c0 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  =r1 ){.      *pR
227d0 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c  eg = r1;.    }el
227e0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
227f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
22800 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
22810 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
22820 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22830 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
22840 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
22850 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
22860 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
22870 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
22880 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
22890 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
228a0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
228b0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
228c0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
228d0 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69  r target..*/.voi
228e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
228f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
22900 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
22910 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
22920 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
22930 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
22940 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
22950 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
22960 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
22970 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
22980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22990 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
229a0 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
229b0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
229c0 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
229d0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
229e0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
229f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22a00 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
22a10 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
22a20 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  be!=0 || pParse-
22a30 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
22a40 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
22a50 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
22a60 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
22a70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22a80 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
22a90 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
22aa0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
22ab0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
22ac0 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69  ** Make a transi
22ad0 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72  ent copy of expr
22ae0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
22af0 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73   then code it us
22b00 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  ing.** sqlite3Ex
22b10 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20  prCode().  This 
22b20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75  routine works ju
22b30 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45  st like sqlite3E
22b40 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63  xprCode().** exc
22b50 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e 70  ept that the inp
22b60 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
22b70 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
22b80 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
22b90 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
22ba0 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
22bb0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
22bc0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
22bd0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
22be0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22bf0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
22c00 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
22c10 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  , 0);.  if( !db-
22c20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
22c30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
22c40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
22c50 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  arget);.  sqlite
22c60 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
22c70 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
22c80 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
22c90 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
22ca0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
22cb0 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
22cc0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
22cd0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
22ce0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
22cf0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
22d00 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
22d10 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66  ster target.  If
22d20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22d30 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  is constant, the
22d40 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
22d50 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74  * might choose t
22d60 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65  o code the expre
22d70 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c  ssion at initial
22d80 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
22d90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
22da0 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
22db0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
22dc0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
22dd0 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70  target){.  if( p
22de0 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
22df0 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45  ctor && sqlite3E
22e00 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
22e10 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
22e20 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
22e30 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
22e40 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d   target, 0);.  }
22e50 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
22e60 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
22e70 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
22e80 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
22e90 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
22ea0 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20  t evaluates the 
22eb0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
22ec0 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
22ed0 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
22ee0 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
22ef0 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
22f00 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
22f10 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
22f20 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
22f30 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
22f40 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
22f50 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
22f60 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
22f70 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
22f80 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
22f90 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
22fa0 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
22fb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22fc0 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
22fd0 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
22fe0 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
22ff0 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
23000 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
23010 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
23020 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
23030 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
23040 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
23050 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
23060 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
23070 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
23080 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
23090 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
230a0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
230b0 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
230c0 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
230d0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
230e0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
230f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
23100 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
23110 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d   target);.  iMem
23120 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
23130 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
23140 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
23150 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29  y, target, iMem)
23160 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
23170 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b  er(pExpr, iMem);
23180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
23190 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
231a0 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
231b0 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
231c0 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
231d0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
231e0 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
231f0 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
23200 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
23210 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
23220 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
23230 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  ents evaluated..
23240 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
23250 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70  _ECEL_DUP flag p
23260 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75  revents the argu
23270 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  ments from being
23280 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67  .** filled using
23290 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43   OP_SCopy.  OP_C
232a0 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64  opy must be used
232b0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
232c0 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
232d0 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20  FACTOR argument 
232e0 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20  allows constant 
232f0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a  arguments to be.
23300 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20  ** factored out 
23310 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  into initializat
23320 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion code..**.** 
23330 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
23340 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  REF flag means t
23350 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
23360 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68  in the list with
23370 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  .** ExprList.a[]
23380 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
23390 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  >0 have already 
233a0 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61  been evaluated a
233b0 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
233c0 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63  registers at src
233d0 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  Reg, and so the 
233e0 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70  value can be cop
233f0 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a  ied from there..
23400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
23410 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
23420 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
23430 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
23440 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
23450 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
23460 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
23470 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
23480 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
23490 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
234a0 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
234b0 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72  ults */.  int sr
234c0 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  cReg,        /* 
234d0 53 6f 75 72 63 65 20 72 65 67 69 73 74 65 72 73  Source registers
234e0 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   if SQLITE_ECEL_
234f0 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  REF */.  u8 flag
23500 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  s           /* S
23510 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61  QLITE_ECEL_* fla
23520 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  gs */.){.  struc
23530 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
23540 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
23550 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79   j, n;.  u8 copy
23560 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  Op = (flags & SQ
23570 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f  LITE_ECEL_DUP) ?
23580 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43   OP_Copy : OP_SC
23590 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  opy;.  Vdbe *v =
235a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
235b0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
235c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
235d0 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
235e0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
235f0 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65  dbe!=0 );  /* Ne
23600 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61  ver gets this fa
23610 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20  r otherwise */. 
23620 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
23630 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46  r;.  if( !ConstF
23640 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
23650 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ) flags &= ~SQLI
23660 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a  TE_ECEL_FACTOR;.
23670 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
23680 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
23690 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
236a0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
236b0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
236c0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
236d0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
236e0 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 4c 69 73  !=0 && (j = pLis
236f0 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  t->a[i].u.x.iOrd
23700 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20  erByCol)>0 ){.  
23710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23720 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
23730 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72   j+srcReg-1, tar
23740 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  get+i);.    }els
23750 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53  e if( (flags & S
23760 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
23770 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  R)!=0 && sqlite3
23780 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
23790 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
237a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
237b0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
237c0 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29  pr, target+i, 0)
237d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
237e0 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
237f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
23800 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
23810 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
23820 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
23830 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
23840 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
23850 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70  .        if( cop
23860 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  yOp==OP_Copy.   
23870 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71        && (pOp=sq
23880 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
23890 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d  , -1))->opcode==
238a0 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20  OP_Copy.        
238b0 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d   && pOp->p1+pOp-
238c0 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20  >p3+1==inReg.   
238d0 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32        && pOp->p2
238e0 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67  +pOp->p3+1==targ
238f0 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a  et+i.        ){.
23900 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
23910 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  3++;.        }el
23920 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
23930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23940 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67  v, copyOp, inReg
23950 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
23960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23970 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23980 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
23990 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
239a0 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  a BETWEEN operat
239b0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42  or..**.**    x B
239c0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a  ETWEEN y AND z.*
239d0 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
239e0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
239f0 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41  .**.**    x>=y A
23a00 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f  ND x<=z.**.** Co
23a10 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74  de it as such, t
23a20 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f  aking care to do
23a30 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65   the common sube
23a40 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69  xpression.** eli
23a50 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a  mination of x..*
23a60 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66  *.** The xJumpIf
23a70 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
23a80 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a  mines details:.*
23a90 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20  *.**    NULL:   
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61  Store the boolea
23ac0 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b  n result in reg[
23ad0 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69  dest].**    sqli
23ae0 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20  te3ExprIfTrue:  
23af0 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
23b00 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73   if true.**    s
23b10 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23b20 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64  e:     Jump to d
23b30 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a  est if false.**.
23b40 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c  ** The jumpIfNul
23b50 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  l parameter is i
23b60 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49  gnored if xJumpI
23b70 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  f is NULL..*/.st
23b80 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
23b90 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
23ba0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
23bb0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
23bc0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
23bd0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
23be0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
23bf0 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
23c00 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
23c10 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
23c20 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
23c30 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63  n or storage loc
23c40 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ation */.  void 
23c50 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c  (*xJump)(Parse*,
23c60 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20  Expr*,int,int), 
23c70 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b  /* Action to tak
23c80 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
23c90 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
23ca0 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
23cb0 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
23cc0 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70   */.){. Expr exp
23cd0 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65  rAnd;     /* The
23ce0 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e   AND operator in
23cf0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20    x>=y AND x<=z 
23d00 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c   */.  Expr compL
23d10 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20  eft;    /* The  
23d20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x>=y  term */.  
23d30 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20  Expr compRight; 
23d40 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20    /* The  x<=z  
23d50 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65  term */.  Expr e
23d60 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54  xprX;       /* T
23d70 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73  he  x  subexpres
23d80 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sion */.  int re
23d90 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54  gFree1 = 0; /* T
23da0 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
23db0 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d  ister */...  mem
23dc0 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30  set(&compLeft, 0
23dd0 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
23de0 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52  .  memset(&compR
23df0 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ight, 0, sizeof(
23e00 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
23e10 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69  (&exprAnd, 0, si
23e20 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20  zeof(Expr));..  
23e30 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
23e40 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23e50 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
23e60 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
23e70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
23e80 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
23e90 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
23ea0 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
23eb0 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
23ec0 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
23ed0 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
23ee0 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
23ef0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
23f00 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
23f10 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
23f20 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
23f30 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
23f40 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
23f50 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
23f60 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
23f70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
23f80 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
23f90 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
23fa0 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70  ster(&exprX, exp
23fb0 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
23fc0 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
23fd0 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78  Free1));.  if( x
23fe0 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d  Jump ){.    xJum
23ff0 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  p(pParse, &exprA
24000 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
24010 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
24020 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20      exprX.flags 
24030 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a  |= EP_FromJoin;.
24040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24050 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24060 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
24070 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
24080 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
24090 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
240a0 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  ;..  /* Ensure a
240b0 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76  dequate test cov
240c0 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63  erage */.  testc
240d0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
240e0 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
240f0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
24100 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
24110 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
24120 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
24130 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
24140 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
24150 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
24160 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
24170 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
24180 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
24190 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
241a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
241b0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
241c0 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
241d0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
241e0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
241f0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24200 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
24210 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
24220 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
24230 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
24240 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24250 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
24260 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
24270 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
24280 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
24290 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
242a0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
242b0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
242c0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
242d0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
242e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
242f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
24300 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
24310 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
24320 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mp==0 );.}../*.*
24330 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24340 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
24350 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
24360 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
24370 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
24380 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
24390 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
243a0 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
243b0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
243c0 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
243d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
243e0 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
243f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24400 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
24410 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
24420 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
24430 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
24440 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
24450 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
24460 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
24470 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
24480 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
24490 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
244a0 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
244b0 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
244c0 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
244d0 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
244e0 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
244f0 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
24500 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
24510 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
24520 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
24530 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
24540 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
24550 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
24560 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
24570 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
24580 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
24590 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
245a0 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
245b0 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
245c0 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
245d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
245e0 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
245f0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24600 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
24610 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
24620 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
24630 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
24640 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
24650 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
24660 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
24670 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
24680 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
24690 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
246a0 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
246b0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
246c0 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
246d0 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f  )     return;  /
246e0 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
246f0 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
24700 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e  aller */.  if( N
24710 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29  EVER(pExpr==0) )
24720 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20   return;  /* No 
24730 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
24740 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45  pen */.  op = pE
24750 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
24760 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
24770 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
24780 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
24790 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
247a0 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
247b0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
247c0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
247d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
247e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
247f0 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c  ft, d2,jumpIfNul
24800 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
24810 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
24820 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
24830 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24840 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24850 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
24860 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
24870 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24880 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
24890 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
248a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
248b0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
248c0 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
248d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
248e0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
248f0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
24900 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
24910 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
24920 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
24930 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
24940 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24950 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24960 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
24970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24980 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
24990 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
249a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
249b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
249c0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
249d0 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
249e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
249f0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
24a00 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
24a10 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
24a20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
24a30 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
24a40 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
24a50 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
24a60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24a70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
24a80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
24a90 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  OT:.      testca
24aa0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  se( op==TK_IS );
24ab0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24ac0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
24ad0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
24ae0 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
24af0 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a  : TK_NE;.      j
24b00 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
24b10 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
24b20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
24b30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
24b40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
24b50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
24b60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
24b70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
24b80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
24b90 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
24ba0 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
24bb0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
24bc0 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
24bd0 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
24be0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
24bf0 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
24c00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
24c10 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
24c20 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
24c30 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
24c40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24c50 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
24c60 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
24c70 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
24c80 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
24c90 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
24ca0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
24cb0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
24cc0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
24cd0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
24ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
24cf0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
24d00 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
24d10 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24d20 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
24d30 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
24d40 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
24d50 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
24d60 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24d70 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
24d80 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
24d90 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
24da0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
24db0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
24dc0 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
24dd0 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
24de0 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
24df0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
24e00 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
24e10 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
24e20 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
24e30 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
24e40 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
24e50 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24e60 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
24e70 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
24e80 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
24e90 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24ea0 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
24eb0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
24ec0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
24ed0 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
24ee0 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
24ef0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
24f00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
24f10 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
24f20 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
24f30 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
24f40 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
24f50 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
24f60 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
24f70 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
24f80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
24f90 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
24fa0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
24fb0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
24fc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24fd0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
24fe0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
24ff0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
25000 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
25010 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
25020 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
25030 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
25040 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
25050 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
25060 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
25070 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
25080 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
25090 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
250a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
250b0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
250c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
250d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
250e0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
250f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25100 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
25110 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
25120 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
25130 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
25140 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
25150 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
25160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
25170 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
25180 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
25190 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
251a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
251b0 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
251c0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
251d0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  , sqlite3ExprIfT
251e0 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  rue, jumpIfNull)
251f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25200 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
25210 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
25220 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
25230 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
25240 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
25250 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
25260 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
25270 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70  estIfNull = jump
25280 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
25290 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20  destIfFalse;.   
252a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
252b0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
252c0 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
252d0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
252e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
252f0 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
25300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
25310 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
25320 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
25330 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25340 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
25350 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c  lt: {.    defaul
25360 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66  t_expr:.      if
25370 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
25380 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
25390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
253a0 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
253b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
253c0 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
253d0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
253e0 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * No-op */.     
253f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25400 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
25410 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
25420 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
25430 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
25440 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
25450 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74   OP_If, r1, dest
25460 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
25470 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
25480 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
25490 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
254a0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
254b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
254c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
254d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
254e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
254f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
25500 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
25510 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
25520 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
25530 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
25540 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
25550 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
25560 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
25570 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
25580 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
25590 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
255a0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
255b0 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
255c0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
255d0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
255e0 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
255f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
25600 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
25610 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
25620 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
25630 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
25640 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
25650 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
25660 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
25670 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
25680 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
25690 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
256a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
256b0 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
256c0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
256d0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
256e0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
256f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
25700 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
25710 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
25720 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
25730 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
25740 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
25750 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
25760 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
25770 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
25780 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
25790 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
257a0 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73   return; /* Exis
257b0 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
257c0 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
257d0 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  */.  if( pExpr==
257e0 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  0 )    return;..
257f0 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
25800 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
25810 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
25820 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
25830 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
25840 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
25850 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
25860 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
25870 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
25880 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
25890 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
258a0 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
258b0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
258c0 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
258d0 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
258e0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
258f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
25900 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
25910 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
25920 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
25930 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
25940 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
25950 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
25960 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
25970 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
25980 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
25990 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
259a0 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
259b0 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
259c0 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
259d0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
259e0 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
259f0 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
25a00 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
25a10 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
25a20 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
25a30 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
25a40 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
25a50 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
25a60 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
25a70 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
25a80 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
25a90 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
25aa0 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
25ab0 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
25ac0 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
25ad0 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
25ae0 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
25af0 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
25b00 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
25b10 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
25b20 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
25b30 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
25b40 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
25b50 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25b60 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
25b70 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
25b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25b90 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
25ba0 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
25bb0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25bc0 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
25bd0 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
25be0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
25bf0 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
25c00 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
25c10 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
25c20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
25c30 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25c40 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
25c50 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
25c60 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
25c70 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
25c80 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
25c90 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
25ca0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
25cb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25cc0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
25cd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25ce0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
25cf0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
25d00 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
25d10 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
25d20 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
25d30 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
25d40 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25d50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25d60 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
25d70 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
25d80 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25d90 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
25da0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25db0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
25dc0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
25dd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
25de0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
25df0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
25e00 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
25e10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
25e20 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
25e30 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
25e40 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
25e50 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
25e60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25e70 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
25e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25e90 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
25ea0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
25eb0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
25ec0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
25ed0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
25ee0 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
25ef0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
25f00 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
25f10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25f20 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
25f30 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
25f40 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
25f50 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
25f60 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
25f70 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25f80 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25f90 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
25fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
25fb0 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
25fc0 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
25fd0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
25fe0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
25ff0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26000 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
26010 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
26020 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
26030 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b  IS) ? TK_NE : TK
26040 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49  _EQ;.      jumpI
26050 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e  fNull = SQLITE_N
26060 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
26070 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
26080 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
26090 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
260a0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
260b0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
260c0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
260d0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
260e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
260f0 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78  ExprIsVector(pEx
26100 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74  pr->pLeft) ) got
26110 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a  o default_expr;.
26120 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26130 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26140 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
26150 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
26160 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26170 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
26180 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
26190 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
261a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
261b0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
261c0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
261d0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
261e0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
261f0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
26200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26210 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
26220 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26230 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
26240 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
26250 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
26260 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26270 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
26280 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
26290 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
262a0 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
262b0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
262c0 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
262d0 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
262e0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
262f0 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
26300 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
26310 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
26320 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
26330 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26340 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
26350 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
26360 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
26370 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
26380 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26390 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Eq);.      VdbeC
263a0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
263b0 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
263c0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
263d0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
263e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
263f0 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
26400 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
26410 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73  LLEQ);.      ass
26420 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
26430 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
26440 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ne);.      Vd
26450 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26460 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
26470 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
26480 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
26490 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
264a0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
264b0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
264c0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
264d0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
264e0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
264f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
26500 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
26510 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26520 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
26530 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
26540 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  LL: {.      r1 =
26550 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26560 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
26570 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
26580 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
26590 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
265a0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
265b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
265c0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
265d0 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;   VdbeCoverage
265e0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
265f0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
26600 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
26610 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76  NULL );  VdbeCov
26620 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
26630 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
26640 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
26650 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
26660 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26670 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
26680 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
26690 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
266a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
266b0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
266c0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
266d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
266e0 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  lse, jumpIfNull)
266f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
26700 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
26710 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
26720 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
26730 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
26740 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
26750 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26760 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
26770 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
26780 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26790 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
267a0 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
267b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
267c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
267d0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
267e0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
267f0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
26800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26810 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
26820 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
26830 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
26840 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
26850 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
26860 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20    default_expr: 
26870 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41  .      if( exprA
26880 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
26890 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
268a0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
268b0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
268c0 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
268d0 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
268e0 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
268f0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
26900 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
26910 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26920 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
26930 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
26940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26950 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
26960 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
26970 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
26980 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
26990 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
269a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
269b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
269c0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
269d0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
269e0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
269f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
26a00 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
26a10 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
26a20 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
26a30 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
26a40 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
26a50 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71  }../*.** Like sq
26a60 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26a70 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61  () except that a
26a80 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
26a90 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a   pExpr before.**
26aa0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
26ab0 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20  , and that copy 
26ac0 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72  is deleted after
26ad0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
26ae0 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65  . This.** ensure
26af0 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  s that the origi
26b00 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63  nal pExpr is unc
26b10 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  hanged..*/.void 
26b20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26b30 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61  seDup(Parse *pPa
26b40 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
26b50 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a  , int dest,int j
26b60 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71  umpIfNull){.  sq
26b70 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
26b80 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
26b90 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
26ba0 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
26bb0 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
26bc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
26bd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
26be0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
26bf0 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a  , pCopy, dest, j
26c00 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
26c10 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
26c20 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a  ete(db, pCopy);.
26c30 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64  }.../*.** Do a d
26c40 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  eep comparison o
26c50 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  f two expression
26c60 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20   trees.  Return 
26c70 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  0 if the two.** 
26c80 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
26c90 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74  completely ident
26ca0 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20  ical.  Return 1 
26cb0 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f  if they differ o
26cc0 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c  nly.** by a COLL
26cd0 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20  ATE operator at 
26ce0 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20  the top level.  
26cf0 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72  Return 2 if ther
26d00 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65  e are difference
26d10 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20  s.** other than 
26d20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f  the top-level CO
26d30 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
26d40 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
26d50 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
26d60 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
26d70 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
26d80 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
26d90 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
26da0 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
26db0 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
26dc0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
26dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73  ..**.** The pA s
26de0 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69  ide might be usi
26df0 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20  ng TK_REGISTER. 
26e00 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
26e10 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a  case and pB is.*
26e20 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52  * not using TK_R
26e30 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f  EGISTER but is o
26e40 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c  therwise equival
26e50 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  ent, then still 
26e60 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
26e70 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
26e80 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
26e90 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65  rn 2 even if the
26ea0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
26eb0 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
26ec0 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
26ed0 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
26ee0 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
26ef0 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
26f00 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
26f10 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  2 just to be saf
26f20 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
26f30 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
26f40 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f  s 2, then you do
26f50 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77   not really know
26f60 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20   for certain if 
26f70 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
26f80 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
26f90 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75  ame.  But if you
26fa0 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65   get a 0 or 1 re
26fb0 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a  turn, then you.*
26fc0 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  * can be sure th
26fd0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
26fe0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20  e the same.  In 
26ff0 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65  the places where
27000 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
27010 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65   is used, it doe
27020 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65  s not hurt to ge
27030 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74  t an extra 2 - t
27040 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
27050 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
27060 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
27070 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
27080 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
27090 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75  rrect 0 or 1 cou
270a0 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c  ld lead to a mal
270b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
270c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
270d0 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
270e0 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
270f0 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
27100 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
27110 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
27120 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
27130 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
27140 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
27150 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
27160 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
27170 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
27180 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
27190 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
271a0 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
271b0 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
271c0 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
271d0 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
271e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
271f0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
27200 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
27210 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
27220 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
27230 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
27240 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
27250 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29  pLeft, pB, iTab)
27260 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
27270 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
27280 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pB->op==TK_C
27290 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65  OLLATE && sqlite
272a0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c  3ExprCompare(pA,
272b0 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
272c0 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
272d0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
272e0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
272f0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
27300 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70  COLUMN && pA->op
27310 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
27320 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  && pA->u.zToken 
27330 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
27340 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
27350 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
27360 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75  te3StrICmp(pA->u
27370 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
27380 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
27390 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 2;.    }else i
273a0 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e  f( strcmp(pA->u.
273b0 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
273c0 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
273d0 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d   return pA->op==
273e0 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a  TK_COLLATE ? 1 :
273f0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
27400 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
27410 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
27420 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
27430 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
27440 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  n 2;.  if( ALWAY
27450 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
27460 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29   & EP_TokenOnly)
27470 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ==0) ){.    if( 
27480 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
27490 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72  EP_xIsSelect ) r
274a0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
274b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
274c0 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
274d0 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20  B->pLeft, iTab) 
274e0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
274f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
27500 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
27510 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69  t, pB->pRight, i
27520 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
27530 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
27540 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
27550 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
27560 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20  >x.pList, iTab) 
27570 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
27580 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
27590 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
275a0 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70  educed)==0) && p
275b0 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
275c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
275d0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
275e0 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
275f0 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
27600 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
27610 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
27620 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
27630 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
27640 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
27650 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
27660 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
27670 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
27680 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
27690 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
276a0 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
276b0 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
276c0 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
276d0 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
276e0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
276f0 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
27700 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
27710 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
27720 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
27730 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
27740 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
27750 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
27760 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
27770 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27780 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
27790 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
277a0 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
277b0 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
277c0 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
277d0 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
277e0 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
277f0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
27800 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
27810 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
27820 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
27830 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
27840 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
27850 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
27860 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
27870 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
27880 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
27890 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
278a0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
278b0 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
278c0 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
278d0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
278e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
278f0 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
27900 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
27910 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
27920 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
27930 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
27940 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
27950 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
27960 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
27970 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
27980 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
27990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
279a0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
279b0 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
279c0 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
279d0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
279e0 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
279f0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
27a00 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
27a10 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
27a20 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
27a30 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
27a40 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c  rCompare(pExprA,
27a50 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29   pExprB, iTab) )
27a60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
27a70 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
27a80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
27a90 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
27aa0 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
27ab0 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
27ac0 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
27ad0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
27ae0 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
27af0 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
27b00 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
27b10 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
27b20 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
27b30 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
27b40 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
27b50 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
27b60 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
27b70 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
27b80 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
27b90 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
27ba0 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
27bb0 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
27bc0 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
27bd0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
27be0 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
27bf0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
27c00 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
27c10 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
27c20 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
27c30 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
27c40 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
27c50 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
27c60 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
27c70 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
27c80 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
27c90 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
27ca0 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
27cb0 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
27cc0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
27cd0 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
27ce0 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
27cf0 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
27d00 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
27d10 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
27d20 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
27d30 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
27d40 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64  .**.** When in d
27d50 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  oubt, return fal
27d60 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74  se.  Returning t
27d70 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61  rue might give a
27d80 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
27d90 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65  improvement.  Re
27da0 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69  turning false mi
27db0 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66  ght cause a perf
27dc0 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
27dd0 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c  n, but.** it wil
27de0 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68  l always give th
27df0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
27e00 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c   and is hence al
27e10 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e  ways safe..*/.in
27e20 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  t sqlite3ExprImp
27e30 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70  liesExpr(Expr *p
27e40 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69  E1, Expr *pE2, i
27e50 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20  nt iTab){.  if( 
27e60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
27e70 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61  re(pE1, pE2, iTa
27e80 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
27e90 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
27ea0 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
27eb0 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
27ec0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
27ed0 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  1, pE2->pLeft, i
27ee0 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20  Tab).           
27ef0 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
27f00 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
27f10 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
27f20 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
27f30 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
27f40 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
27f50 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c  OTNULL.   && sql
27f60 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
27f70 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d  pE1->pLeft, pE2-
27f80 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30  >pLeft, iTab)==0
27f90 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21  .   && (pE1->op!
27fa0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45  =TK_ISNULL && pE
27fb0 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20  1->op!=TK_IS).  
27fc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
27fd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
27ff0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
28000 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
28010 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
28020 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
28030 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
28040 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  n expression can
28050 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 62 79   be evaluated by
28060 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
28070 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c  e.** index only,
28080 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
28090 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20 66  to do a search f
280a0 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
280b0 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e  ding.** table en
280c0 74 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76  try.  The IdxCov
280d0 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73  er.pIdx field is
280e0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78   the index.  Idx
280f0 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73  Cover.iCur.** is
28100 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
28110 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
28120 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a  ruct IdxCover {.
28130 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
28140 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
28150 74 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f 72  to be tested for
28160 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69   coverage */.  i
28170 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
28180 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
28190 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63   for the table c
281a0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
281b0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a  the index */.};.
281c0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
281d0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
281e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
281f0 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
28200 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  .** pWalker->u.p
28210 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63  IdxCover->iCur c
28220 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 20  an be satisfied 
28230 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a  using the index.
28240 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ** pWalker->u.pI
28250 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a  dxCover->pIdx..*
28260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
28270 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72  rIdxCover(Walker
28280 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
28290 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
282a0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
282b0 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
282c0 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72  >iTable==pWalker
282d0 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69  ->u.pIdxCover->i
282e0 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65  Cur.   && sqlite
282f0 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
28300 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
28310 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72  ver->pIdx, pExpr
28320 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29  ->iColumn)<0.  )
28330 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
28340 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65  Code = 1;.    re
28350 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
28370 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
28380 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
28390 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f   an index pIdx o
283a0 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  n table with cur
283b0 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e  sor iCur contain
283c0 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78  s will.** the ex
283d0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
283e0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
283f0 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63  the index does c
28400 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72  over the.** expr
28410 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65  ession and false
28420 20 69 66 20 74 68 65 20 70 45 78 70 72 20 65 78   if the pExpr ex
28430 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e  pression referen
28440 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ces table column
28450 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f  s.** that are no
28460 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69  t found in the i
28470 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
28480 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69   An index coveri
28490 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
284a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
284b0 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
284c0 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75  e.** evaluated u
284d0 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e  sing only the in
284e0 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20  dex and without 
284f0 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70  having to lookup
28500 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
28510 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72  nding table entr
28520 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
28530 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e  3ExprCoveredByIn
28540 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78  dex(.  Expr *pEx
28550 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  pr,        /* Th
28560 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65  e index to be te
28570 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sted */.  int iC
28580 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ur,           /*
28590 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   The cursor numb
285a0 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  er for the corre
285b0 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a  sponding table *
285c0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
285d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
285e0 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68 74 20  ndex that might 
285f0 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65  be used for cove
28600 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c  rage */.){.  Wal
28610 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
28620 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20  IdxCover xcov;. 
28630 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
28640 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f  izeof(w));.  xco
28650 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  v.iCur = iCur;. 
28660 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64   xcov.pIdx = pId
28670 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  x;.  w.xExprCall
28680 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f  back = exprIdxCo
28690 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43  ver;.  w.u.pIdxC
286a0 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20  over = &xcov;.  
286b0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
286c0 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65  &w, pExpr);.  re
286d0 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d  turn !w.eCode;.}
286e0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  .../*.** An inst
286f0 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
28700 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
28710 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
28720 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
28730 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65   count reference
28740 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d  s to table colum
28750 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ns in the argume
28760 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67  nts of an .** ag
28770 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
28780 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  , in order to im
28790 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73  plement the.** s
287a0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68  qlite3FunctionTh
287b0 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e  isSrc() routine.
287c0 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f  .*/.struct SrcCo
287d0 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20  unt {.  SrcList 
287e0 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20  *pSrc;   /* One 
287f0 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20  particular FROM 
28800 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74  clause in a nest
28810 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ed query */.  in
28820 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f  t nThis;       /
28830 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
28840 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
28850 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f  s in pSrcList */
28860 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20  .  int nOther;  
28870 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28880 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
28890 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20  olumns in other 
288a0 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a  FROM clauses */.
288b0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  };../*.** Count 
288c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
288d0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
288e0 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mns..*/.static i
288f0 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28  nt exprSrcCount(
28900 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
28910 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
28920 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20   /* The NEVER() 
28930 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65  on the second te
28940 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71  rm is because sq
28950 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
28960 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20  sThisSrc().  ** 
28970 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64  is always called
28980 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45   before sqlite3E
28990 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
289a0 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68  ates() and so th
289b0 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e  e.  ** TK_COLUMN
289c0 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  s have not yet b
289d0 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  een converted in
289e0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
289f0 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74  .  If.  ** sqlit
28a00 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
28a10 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20  isSrc() is used 
28a20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74  differently in t
28a30 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20  he future, the. 
28a40 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c   ** NEVER() will
28a50 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f   need to be remo
28a60 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45  ved. */.  if( pE
28a70 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
28a80 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70  MN || NEVER(pExp
28a90 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
28aa0 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74  LUMN) ){.    int
28ab0 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   i;.    struct S
28ac0 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61  rcCount *p = pWa
28ad0 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e  lker->u.pSrcCoun
28ae0 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
28af0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
28b00 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70      int nSrc = p
28b10 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63  Src ? pSrc->nSrc
28b20 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
28b30 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
28b40 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
28b50 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
28b60 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62  a[i].iCursor ) b
28b70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
28b80 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20  if( i<nSrc ){.  
28b90 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a      p->nThis++;.
28ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28bb0 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20   p->nOther++;.  
28bc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28bd0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28be0 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
28bf0 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
28c00 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
28c10 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20   pExpr Function 
28c20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72  reference.** pSr
28c30 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74  cList.  Return t
28c40 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20  rue if they do. 
28c50 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
28c60 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e if the functio
28c70 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75  n.** has no argu
28c80 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c  ments or has onl
28c90 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  y constant argum
28ca0 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61  ents.  Return fa
28cb0 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20  lse if pExpr.** 
28cc0 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d  references colum
28cd0 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d  ns but not colum
28ce0 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75  ns of tables fou
28cf0 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a  nd in pSrcList..
28d00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75  */.int sqlite3Fu
28d10 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
28d20 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53  c(Expr *pExpr, S
28d30 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
28d40 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
28d50 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
28d60 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20   cnt;.  assert( 
28d70 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
28d80 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
28d90 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
28da0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
28db0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
28dc0 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
28dd0 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
28de0 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
28df0 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
28e00 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
28e10 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
28e20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
28e30 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
28e40 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
28e50 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
28e60 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
28e70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
28e80 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
28e90 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
28ea0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
28eb0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
28ec0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
28ed0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
28ee0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
28ef0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
28f00 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
28f10 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
28f20 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
28f30 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
28f40 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
28f50 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
28f60 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
28f70 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
28f80 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
28f90 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
28fa0 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
28fb0 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
28fc0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
28fd0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
28fe0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
28ff0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
29000 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
29010 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
29020 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
29030 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
29040 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
29050 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
29060 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
29070 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
29080 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
29090 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
290a0 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
290b0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
290c0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
290d0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
290e0 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
290f0 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
29100 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
29110 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
29120 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
29130 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
29140 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
29150 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
29160 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
29170 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
29180 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
29190 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
291a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
291b0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
291c0 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
291d0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
291e0 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
291f0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
29200 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29210 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
29220 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
29230 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
29240 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
29250 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
29260 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
29270 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
29280 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
29290 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
292a0 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
292b0 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
292c0 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
292d0 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
292e0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
292f0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
29300 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
29310 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
29320 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
29330 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
29340 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
29350 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
29360 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
29370 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
29380 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
29390 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
293a0 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
293b0 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
293c0 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
293d0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
293e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
293f0 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
29400 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
29410 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
29420 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
29430 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
29440 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
29450 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
29460 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
29470 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
29480 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
29490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
294a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
294b0 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
294c0 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
294d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
294e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
294f0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
29500 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
29510 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
29520 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
29530 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
29540 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
29550 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
29560 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
29570 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
29580 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
29590 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
295a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
295b0 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
295c0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
295d0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
295e0 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
295f0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
29600 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
29610 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
29620 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
29630 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
29640 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
29650 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
29660 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
29670 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
29680 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
29690 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
296a0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
296b0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
296c0 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
296d0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
296e0 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
296f0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
29700 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
29710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
29720 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29730 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
29740 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
29750 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
29760 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
29770 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
29780 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
29790 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
297a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
297b0 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
297c0 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
297d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
297e0 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
297f0 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
29800 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
29810 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
29820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29830 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
29840 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
29860 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
29870 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
29880 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
29890 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
298a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
298b0 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
298c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
298d0 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
298e0 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
29900 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
29910 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
29920 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
29930 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
29940 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
29950 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
29960 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
29970 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29980 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
29990 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
299a0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
299b0 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299d0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
299e0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
299f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29a00 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
29a10 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
29a20 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
29a30 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
29a40 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
29a50 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
29a60 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
29a70 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
29a80 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
29a90 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
29aa0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
29ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29af0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
29b00 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
29b30 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
29b40 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
29b50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29b60 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
29b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29b80 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
29b90 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
29ba0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
29bb0 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
29bc0 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
29bd0 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
29be0 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
29bf0 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
29c00 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
29c10 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
29c20 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
29c30 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
29c40 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
29c50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
29c60 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
29c70 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
29c80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
29c90 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
29ca0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
29cb0 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
29cc0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
29cd0 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
29ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
29cf0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
29d00 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
29d10 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
29d20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
29d30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29d40 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
29d50 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
29d60 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
29d70 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
29d80 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
29d90 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
29da0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
29db0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
29dc0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
29dd0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
29de0 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
29df0 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
29e00 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
29e10 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
29e20 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
29e30 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
29e40 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
29e50 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
29e60 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
29e70 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
29e80 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
29e90 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
29ea0 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
29eb0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
29ec0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29ed0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
29ee0 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
29ef0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
29f00 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
29f10 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
29f20 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
29f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29f40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29f50 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
29f60 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
29f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
29f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
29f90 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29fa0 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
29fb0 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
29fc0 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
29fd0 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
29fe0 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
29ff0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
2a000 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
2a010 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
2a020 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
2a030 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
2a040 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
2a050 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
2a060 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2a070 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
2a080 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2a090 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a0a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
2a0b0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2a0c0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
2a0d0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
2a0e0 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
2a0f0 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
2a100 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
2a110 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
2a120 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2a130 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
2a140 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2a150 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2a160 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
2a170 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2a180 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
2a190 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
2a1a0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2a1c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20  r->u.zToken, .  
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1e0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
2a1f0 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
2a200 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
2a210 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2a220 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
2a230 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2a240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a250 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2a260 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2a270 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
2a280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a290 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2a2a0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2a2b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a2c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a2d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
2a2e0 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
2a2f0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2a300 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2a310 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
2a320 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2a330 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2a340 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2a350 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2a360 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
2a370 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2a380 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2a390 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
2a3a0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2a3b0 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
2a3c0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2a3d0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2a3e0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2a3f0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2a400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2a410 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
2a420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a430 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2a440 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
2a450 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2a460 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
2a470 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2a480 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2a490 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2a4a0 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55  ER(pWalker);.  U
2a4b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a4c0 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
2a4d0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2a4e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
2a4f0 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  e the pExpr expr
2a500 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
2a510 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
2a520 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
2a530 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
2a540 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
2a550 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a  d to AggInfo obj
2a560 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41  ect that pNC->pA
2a570 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73  ggInfo.** points
2a580 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c   to.  Additional
2a590 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
2a5a0 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  e on the AggInfo
2a5b0 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65   object as.** ne
2a5c0 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
2a5d0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
2a5e0 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2a5f0 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
2a600 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
2a610 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
2a620 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
2a630 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
2a640 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
2a650 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
2a660 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
2a670 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2a680 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
2a690 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
2a6a0 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
2a6b0 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2a6c0 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
2a6d0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2a6e0 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2a6f0 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
2a700 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
2a710 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
2a720 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
2a730 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2a740 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
2a750 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
2a760 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2a770 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
2a780 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
2a790 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
2a7a0 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
2a7b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2a7c0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
2a7d0 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
2a7e0 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
2a7f0 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
2a800 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2a810 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
2a820 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2a830 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2a840 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
2a850 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2a860 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2a870 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2a880 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
2a890 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
2a8a0 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
2a8b0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2a8c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2a8d0 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
2a8e0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2a8f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
2a900 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
2a910 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
2a920 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
2a930 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
2a940 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
2a950 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2a960 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2a970 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2a980 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
2a990 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
2a9a0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
2a9b0 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
2a9c0 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
2a9d0 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
2a9e0 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2a9f0 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
2aa00 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
2aa10 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
2aa20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
2aa30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
2aa40 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
2aa50 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
2aa60 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2aa70 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
2aa80 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64  eallocation is d
2aa90 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
2aaa0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c  e column cache l
2aab0 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a  ine that uses.**
2aac0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65   the register be
2aad0 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a  comes stale..*/.
2aae0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
2aaf0 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
2ab00 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2ab10 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
2ab20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
2ab30 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
2ab40 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
2ab50 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2ab60 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
2ab70 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  he *p;.    for(i
2ab80 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
2ab90 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
2aba0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
2abb0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69  +, p++){.      i
2abc0 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
2abd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74   ){.        p->t
2abe0 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  empReg = 1;.    
2abf0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2ac00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
2ac10 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
2ac20 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
2ac30 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
2ac40 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2ac50 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
2ac60 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
2ac70 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
2ac80 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ters.*/.int sqli
2ac90 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
2aca0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2acb0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
2acc0 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72  i, n;.  i = pPar
2acd0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
2ace0 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
2acf0 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
2ad00 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73  eg<=n ){.    ass
2ad10 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75  ert( !usedAsColu
2ad20 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
2ad30 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20  i, i+n-1) );.   
2ad40 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2ad50 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
2ad60 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2ad70 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
2ad80 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
2ad90 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2ada0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2adb0 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
2adc0 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
2add0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2ade0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2adf0 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
2ae00 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74  t nReg){.  sqlit
2ae10 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
2ae20 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
2ae30 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65  nReg);.  if( nRe
2ae40 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
2ae50 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
2ae60 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
2ae70 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2ae80 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
2ae90 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2aea0 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61  Mark all tempora
2aeb0 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20  ry registers as 
2aec0 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c  being unavailabl
2aed0 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  e for reuse..*/.
2aee0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
2aef0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61  rTempRegCache(Pa
2af00 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2af10 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2af20 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2af30 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
2af40 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65  ../*.** Validate
2af50 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61   that no tempora
2af60 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c  ry register fall
2af70 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  s within the ran
2af80 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e  ge of.** iFirst.
2af90 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76  .iLast, inclusiv
2afa0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2afb0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72   is only call fr
2afc0 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  om within assert
2afd0 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ().** statements
2afe0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2aff0 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
2b000 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e  ite3NoTempsInRan
2b010 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2b020 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e  , int iFirst, in
2b030 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20  t iLast){.  int 
2b040 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  i;.  if( pParse-
2b050 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20  >nRangeReg>0.   
2b060 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2b070 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61  eReg+pParse->nRa
2b080 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a 20 20 20  ngeReg<iLast.   
2b090 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2b0a0 65 52 65 67 3e 3d 69 46 69 72 73 74 0a 20 20 29  eReg>=iFirst.  )
2b0b0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
2b0c0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2b0d0 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  i<pParse->nTempR
2b0e0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  eg; i++){.    if
2b0f0 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  ( pParse->aTempR
2b100 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26  eg[i]>=iFirst &&
2b110 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2b120 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  g[i]<=iLast ){. 
2b130 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2b140 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2b150 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
2b160 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2b170 0a                                               .