/ Hex Artifact Content
Login

Artifact 1f2ddbec8bf6de323cc0da3ff73e80b0ad21769d:


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 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
0830: 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a  pr->affinity;.}.
0840: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
0850: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0860: 65 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  e for expression
0870: 20 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65   pExpr to be the
0880: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
0890: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20  quence named by 
08a0: 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e  pToken.   Return
08b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
08c0: 6e 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68  new Expr node th
08d0: 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  at.** implements
08e0: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
08f0: 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
0900: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
0910: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
0920: 2c 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72  , that fact is r
0930: 65 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73  ecorded in pPars
0940: 65 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65  e->db.** and the
0950: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
0960: 20 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63   is returned unc
0970: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  hanged..*/.Expr 
0980: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0990: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50  ollateToken(.  P
09a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
09b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
09c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
09d0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
09e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
09f0: 74 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c  the "COLLATE" cl
0a00: 61 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70  ause to this exp
0a10: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ression */.  con
0a20: 73 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e  st Token *pCollN
0a30: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
0a40: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0a50: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  nce */.  int deq
0a60: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
0a70: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
0a80: 75 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a  uote pCollName *
0a90: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  /.){.  if( pColl
0aa0: 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  Name->n>0 ){.   
0ab0: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
0ac0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
0ad0: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f  Parse->db, TK_CO
0ae0: 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65  LLATE, pCollName
0af0: 2c 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20  , dequote);.    
0b00: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0b10: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
0b20: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
0b30: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  w->flags |= EP_C
0b40: 6f 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a  ollate|EP_Skip;.
0b50: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
0b60: 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ew;.    }.  }.  
0b70: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0b80: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0b90: 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
0ba0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
0bb0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f   Expr *pExpr, co
0bc0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20  nst char *zC){. 
0bd0: 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65   Token s;.  asse
0be0: 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73  rt( zC!=0 );.  s
0bf0: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
0c00: 26 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a  &s, (char*)zC);.
0c10: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0c20: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
0c30: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  ken(pParse, pExp
0c40: 72 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  r, &s, 0);.}../*
0c50: 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e  .** Skip over an
0c60: 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65  y TK_COLLATE ope
0c70: 72 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75  rators and any u
0c80: 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20  nlikely().** or 
0c90: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e  likelihood() fun
0ca0: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f  ction at the roo
0cb0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
0cc0: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
0cd0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
0ce0: 61 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  ate(Expr *pExpr)
0cf0: 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72  {.  while( pExpr
0d00: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
0d10: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b  rty(pExpr, EP_Sk
0d20: 69 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45  ip) ){.    if( E
0d30: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0d40: 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c  Expr, EP_Unlikel
0d50: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  y) ){.      asse
0d60: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0d70: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
0d80: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
0d90: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0da0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
0db0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
0dc0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
0dd0: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
0de0: 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
0df0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
0e00: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
0e10: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
0e20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
0e30: 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
0e40: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
0e50: 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  Left;.    }.  } 
0e60: 20 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70    .  return pExp
0e70: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0e80: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
0e90: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
0ea0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
0eb0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
0ec0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
0ed0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ee0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
0ef0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
0f00: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68  ng sequence migh
0f10: 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  t be determined 
0f20: 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
0f30: 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74  rator.** or by t
0f40: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
0f50: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64   column with a d
0f60: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
0f70: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f   sequence..** CO
0f80: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
0f90: 74 61 6b 65 20 66 69 72 73 74 20 70 72 65 63 65  take first prece
0fa0: 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65  dence.  Left ope
0fb0: 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72  rands take.** pr
0fc0: 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69  ecedence over ri
0fd0: 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f  ght operands..*/
0fe0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
0ff0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72  3ExprCollSeq(Par
1000: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1010: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
1020: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1030: 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ->db;.  CollSeq 
1040: 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78  *pColl = 0;.  Ex
1050: 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20  pr *p = pExpr;. 
1060: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
1070: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   int op = p->op;
1080: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1090: 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29  s & EP_Generic )
10a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
10b0: 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f  op==TK_CAST || o
10c0: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20  p==TK_UPLUS ){. 
10d0: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
10e0: 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  t;.      continu
10f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1100: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20   op==TK_COLLATE 
1110: 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  || (op==TK_REGIS
1120: 54 45 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54  TER && p->op2==T
1130: 4b 5f 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20  K_COLLATE) ){.  
1140: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1150: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1160: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1170: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
1180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1190: 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d   }.    if( (op==
11a0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c  TK_AGG_COLUMN ||
11b0: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20   op==TK_COLUMN. 
11c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d           || op==
11d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
11e0: 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20  p==TK_TRIGGER). 
11f0: 20 20 20 20 26 26 20 70 2d 3e 70 54 61 62 21 3d      && p->pTab!=
1200: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  0.    ){.      /
1210: 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  * op==TK_REGISTE
1220: 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  R && p->pTab!=0 
1230: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78  happens when pEx
1240: 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  pr was originall
1250: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f  y.      ** a TK_
1260: 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70  COLUMN but was p
1270: 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61  reviously evalua
1280: 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20 69  ted and cached i
1290: 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  n a register */.
12a0: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d        int j = p-
12b0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
12c0: 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20  if( j>=0 ){.    
12d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12e0: 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d  zColl = p->pTab-
12f0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
1300: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1310: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
1320: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
1330: 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  zColl, 0);.     
1340: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1350: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
1360: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1370: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
1380: 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d   p->pLeft && (p-
1390: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
13a0: 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29  EP_Collate)!=0 )
13b0: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d  {.        p = p-
13c0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65  >pLeft;.      }e
13d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70  lse{.        Exp
13e0: 72 20 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70  r *pNext  = p->p
13f0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f  Right;.        /
1400: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
1410: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
1420: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
1430: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
1440: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1450: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
1460: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
1470: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
1480: 70 2d 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45  p->flags holds E
1490: 50 5f 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d  P_Collate and p-
14a0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f  >pLeft->flags do
14b0: 65 73 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20  es not.  And.   
14c0: 20 20 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65       ** p->x.pSe
14d0: 6c 65 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f  lect cannot.  So
14e0: 20 69 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65   if p->x.pLeft e
14f0: 78 69 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68  xists, it must h
1500: 6f 6c 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a  old at.        *
1510: 2a 20 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43  * least one EP_C
1520: 6f 6c 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65  ollate. Thus the
1530: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41   following two A
1540: 4c 57 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20  LWAYS. */.      
1550: 20 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74    if( p->x.pList
1560: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 21 45  !=0 && ALWAYS(!E
1570: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1580: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
1590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
15a0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t i;.          f
15b0: 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
15c0: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
15d0: 70 72 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  pr); i++){.     
15e0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
15f0: 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e  asProperty(p->x.
1600: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1610: 72 2c 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29  r, EP_Collate) )
1620: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1630: 70 4e 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69  pNext = p->x.pLi
1640: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1660: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1670: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1690: 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20   p = pNext;.    
16a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
16b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16c0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  }.  }.  if( sqli
16d0: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
16e0: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
16f0: 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  { .    pColl = 0
1700: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1710: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  Coll;.}../*.** p
1720: 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61  Expr is an opera
1730: 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  nd of a comparis
1740: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66  on operator.  af
1750: 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70  f2 is the.** typ
1760: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
1770: 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e  e other operand.
1780: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
1790: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79  eturns the.** ty
17a0: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
17b0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
17c0: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
17d0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
17e0: 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70  char sqlite3Comp
17f0: 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72  areAffinity(Expr
1800: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66   *pExpr, char af
1810: 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31  f2){.  char aff1
1820: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
1830: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
1840: 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66   if( aff1 && aff
1850: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68  2 ){.    /* Both
1860: 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f   sides of the co
1870: 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c  mparison are col
1880: 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73  umns. If one has
1890: 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20   numeric.    ** 
18a0: 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68  affinity, use th
18b0: 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73  at. Otherwise us
18c0: 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20  e no affinity.. 
18d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
18e0: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
18f0: 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20  finity(aff1) || 
1900: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
1910: 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29  Affinity(aff2) )
1920: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1930: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1940: 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  C;.    }else{.  
1950: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1960: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
1970: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  }.  }else if( !a
1980: 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a  ff1 && !aff2 ){.
1990: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73      /* Neither s
19a0: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
19b0: 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  rison is a colum
19c0: 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a  n.  Compare the.
19d0: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64      ** results d
19e0: 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  irectly..    */.
19f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a00: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65  E_AFF_BLOB;.  }e
1a10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  lse{.    /* One 
1a20: 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  side is a column
1a30: 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e  , the other is n
1a40: 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75  ot. Use the colu
1a50: 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  mns affinity. */
1a60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66  .    assert( aff
1a70: 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20  1==0 || aff2==0 
1a80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  );.    return (a
1a90: 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d  ff1 + aff2);.  }
1aa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1ab0: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1ac0: 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72  operator.  Retur
1ad0: 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  n the type affin
1ae0: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ity that should.
1af0: 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ** be applied to
1b00: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70   both operands p
1b10: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68  rior to doing th
1b20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f  e comparison..*/
1b30: 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d  .static char com
1b40: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
1b50: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1b60: 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65  char aff;.  asse
1b70: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1b80: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
1b90: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70  p==TK_IN || pExp
1ba0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a  r->op==TK_LT ||.
1bb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1bc0: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45  >op==TK_GT || pE
1bd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c  xpr->op==TK_GE |
1be0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1bf0: 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  LE ||.          
1c00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
1c10: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
1c20: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
1c30: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1c40: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c50: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1c60: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1c70: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1c80: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1c90: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1ca0: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1cb0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1cc0: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
1cd0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
1ce0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1cf0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1d00: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
1d10: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d20: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
1d30: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
1d40: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
1d50: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45  ;.  }else if( NE
1d60: 56 45 52 28 61 66 66 3d 3d 30 29 20 29 7b 0a 20  VER(aff==0) ){. 
1d70: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
1d80: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
1d90: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
1da0: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1db0: 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65  comparison expre
1dc0: 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20  ssion, eg. '=', 
1dd0: 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63  '<', IN(...) etc
1de0: 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74  ..** idx_affinit
1df0: 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74  y is the affinit
1e00: 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  y of an indexed 
1e10: 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74  column. Return t
1e20: 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e  rue.** if the in
1e30: 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74  dex with affinit
1e40: 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d  y idx_affinity m
1e50: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  ay be used to im
1e60: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63  plement.** the c
1e70: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78  omparison in pEx
1e80: 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pr..*/.int sqlit
1e90: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
1ea0: 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  k(Expr *pExpr, c
1eb0: 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79  har idx_affinity
1ec0: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  ){.  char aff = 
1ed0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1ee0: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69  ty(pExpr);.  swi
1ef0: 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20  tch( aff ){.    
1f00: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1f10: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
1f20: 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53  rn 1;.    case S
1f30: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
1f40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78        return idx
1f50: 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  _affinity==SQLIT
1f60: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
1f70: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
1f80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e  eturn sqlite3IsN
1f90: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69  umericAffinity(i
1fa0: 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  dx_affinity);.  
1fb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1fc0: 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74  n the P5 value t
1fd0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1fe0: 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20  ed for a binary 
1ff0: 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70  comparison.** op
2000: 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f  code (OP_Eq, OP_
2010: 47 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f  Ge etc.) used to
2020: 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20   compare pExpr1 
2030: 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73  and pExpr2..*/.s
2040: 74 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43  tatic u8 binaryC
2050: 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70  ompareP5(Expr *p
2060: 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78  Expr1, Expr *pEx
2070: 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  pr2, int jumpIfN
2080: 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d  ull){.  u8 aff =
2090: 20 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78   (char)sqlite3Ex
20a0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
20b0: 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29  2);.  aff = (u8)
20c0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
20d0: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
20e0: 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66  ff) | (u8)jumpIf
20f0: 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  Null;.  return a
2100: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ff;.}../*.** Ret
2110: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2120: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
2130: 65 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f  equence that sho
2140: 75 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a  uld be used by.*
2150: 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  * a binary compa
2160: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63  rison operator c
2170: 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61  omparing pLeft a
2180: 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  nd pRight..**.**
2190: 20 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e   If the left han
21a0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  d expression has
21b0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
21c0: 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e  uence type, then
21d0: 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20   it is.** used. 
21e0: 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f  Otherwise the co
21f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
2200: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68   for the right h
2210: 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  and expression.*
2220: 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68  * is used, or th
2230: 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52  e default (BINAR
2240: 59 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78  Y) if neither ex
2250: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
2260: 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65  ollating.** type
2270: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
2280: 20 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74   pRight (but not
2290: 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61   pLeft) may be a
22a0: 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49   null pointer. I
22b0: 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
22c0: 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  it is not consid
22d0: 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ered..*/.CollSeq
22e0: 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43   *sqlite3BinaryC
22f0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20  ompareCollSeq(. 
2300: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2310: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
2320: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
2330: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
2340: 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  oll;.  assert( p
2350: 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c  Left );.  if( pL
2360: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
2370: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70  Collate ){.    p
2380: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2390: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
23a0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73  , pLeft);.  }els
23b0: 65 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20  e if( pRight && 
23c0: 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  (pRight->flags &
23d0: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20   EP_Collate)!=0 
23e0: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
23f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2400: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
2410: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2420: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2430: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
2440: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  e, pLeft);.    i
2450: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
2460: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2470: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2480: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
2490: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
24a0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
24b0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24c0: 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e  for a comparison
24d0: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   operator..*/.st
24e0: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d  atic int codeCom
24f0: 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70  pare(.  Parse *p
2500: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65  Parse,    /* The
2510: 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f   parsing (and co
2520: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63  de generating) c
2530: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
2540: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a   *pLeft,      /*
2550: 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   The left operan
2560: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
2570: 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ght,     /* The 
2580: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
2590: 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20  .  int opcode,  
25a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
25b0: 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  arison opcode */
25c0: 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20  .  int in1, int 
25d0: 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72  in2, /* Register
25e0: 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64   holding operand
25f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  s */.  int dest,
2600: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
2610: 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20   here if true.  
2620: 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
2630: 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75  ull    /* If tru
2640: 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65  e, jump if eithe
2650: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
2660: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35  L */.){.  int p5
2670: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
2680: 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20  CollSeq *p4;..  
2690: 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  p4 = sqlite3Bina
26a0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
26b0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
26c0: 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20  pRight);.  p5 = 
26d0: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
26e0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a  pLeft, pRight, j
26f0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64  umpIfNull);.  ad
2700: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2710: 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70  AddOp4(pParse->p
2720: 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e  Vdbe, opcode, in
2730: 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20  2, dest, in1,.  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
2760: 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  p4, P4_COLLSEQ);
2770: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2780: 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70  angeP5(pParse->p
2790: 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20  Vdbe, (u8)p5);. 
27a0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
27b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
27c0: 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ue if expression
27d0: 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74   pExpr is a vect
27e0: 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  or, or false oth
27f0: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  erwise..**.** A 
2800: 76 65 63 74 6f 72 20 69 73 20 64 65 66 69 6e 65  vector is define
2810: 64 20 61 73 20 61 6e 79 20 65 78 70 72 65 73 73  d as any express
2820: 69 6f 6e 20 74 68 61 74 20 72 65 73 75 6c 74 73  ion that results
2830: 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   in two or more.
2840: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 72 65  ** columns of re
2850: 73 75 6c 74 2e 20 20 45 76 65 72 79 20 54 4b 5f  sult.  Every TK_
2860: 56 45 43 54 4f 52 20 6e 6f 64 65 20 69 73 20 61  VECTOR node is a
2870: 6e 20 76 65 63 74 6f 72 20 62 65 63 61 75 73 65  n vector because
2880: 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 77   the.** parser w
2890: 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  ill not generate
28a0: 20 61 20 54 4b 5f 56 45 43 54 4f 52 20 77 69 74   a TK_VECTOR wit
28b0: 68 20 66 65 77 65 72 20 74 68 61 6e 20 74 77 6f  h fewer than two
28c0: 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20 42 75 74   entries..** But
28d0: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 6d 69 67   a TK_SELECT mig
28e0: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 76  ht be either a v
28f0: 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61  ector or a scala
2900: 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a  r. It is only.**
2910: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 65   considered a ve
2920: 63 74 6f 72 20 69 66 20 69 74 20 68 61 73 20 74  ctor if it has t
2930: 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65 73 75 6c  wo or more resul
2940: 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e  t columns..*/.in
2950: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  t sqlite3ExprIsV
2960: 65 63 74 6f 72 28 45 78 70 72 20 2a 70 45 78 70  ector(Expr *pExp
2970: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
2980: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2990: 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a  ze(pExpr)>1;.}..
29a0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
29b0: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
29c0: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
29d0: 65 6e 74 20 69 73 20 6f 66 20 74 79 70 65 20 54  ent is of type T
29e0: 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74  K_VECTOR .** ret
29f0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2a00: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  f expressions in
2a10: 20 74 68 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c   the vector. Or,
2a20: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
2a30: 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73  on.** is a sub-s
2a40: 65 6c 65 63 74 2c 20 72 65 74 75 72 6e 20 74 68  elect, return th
2a50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
2a60: 6d 6e 73 20 69 6e 20 74 68 65 20 73 75 62 2d 73  mns in the sub-s
2a70: 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e  elect. For.** an
2a80: 79 20 6f 74 68 65 72 20 74 79 70 65 20 6f 66 20  y other type of 
2a90: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
2aa0: 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1..*/.int sql
2ab0: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2ac0: 7a 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ze(Expr *pExpr){
2ad0: 0a 20 20 75 38 20 6f 70 20 3d 20 70 45 78 70 72  .  u8 op = pExpr
2ae0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
2af0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
2b00: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 20   = pExpr->op2;. 
2b10: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54   if( op==TK_VECT
2b20: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
2b30: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
2b40: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 20  >nExpr;.  }else 
2b50: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
2b60: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2b70: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
2b80: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
2b90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2ba0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 23  turn 1;.  }.}..#
2bb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2bc0: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
2bd0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2be0: 65 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65  er to a subexpre
2bf0: 73 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72  ssion of pVector
2c00: 20 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74   that is the i-t
2c10: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  h.** column of t
2c20: 68 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65  he vector (numbe
2c30: 72 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  red starting wit
2c40: 68 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65  h 0).  The calle
2c50: 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65  r must.** ensure
2c60: 20 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69   that i is withi
2c70: 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  n range..**.** I
2c80: 66 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61  f pVector is rea
2c90: 6c 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e  lly a scalar (an
2ca0: 64 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20  d "scalar" here 
2cb0: 69 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72  includes subquer
2cc0: 69 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75  ies.** that retu
2cd0: 72 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  rn a single colu
2ce0: 6d 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e  mn!) then return
2cf0: 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66   pVector unmodif
2d00: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74  ied..**.** pVect
2d10: 6f 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72  or retains owner
2d20: 73 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75  ship of the retu
2d30: 72 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69  rned subexpressi
2d40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
2d50: 20 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45   vector is a (SE
2d60: 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74  LECT ...) then t
2d70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
2d80: 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73  turned is.** jus
2d90: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
2da0: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65   for the i-th te
2db0: 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
2dc0: 20 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a   set, and may.**
2dd0: 20 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f   not be ready fo
2de0: 72 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63  r evaluation bec
2df0: 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63  ause the table c
2e00: 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65  ursor has not ye
2e10: 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69  t.** been positi
2e20: 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oned..*/.Expr *s
2e30: 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
2e40: 64 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70  dSubexpr(Expr *p
2e50: 56 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a  Vector, int i){.
2e60: 20 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69    assert( i<sqli
2e70: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
2e80: 65 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20  e(pVector) );.  
2e90: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
2ea0: 73 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29  sVector(pVector)
2eb0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63   ){.    if( pVec
2ec0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tor->op==TK_SELE
2ed0: 43 54 0a 20 20 20 20 20 7c 7c 20 28 70 56 65 63  CT.     || (pVec
2ee0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  tor->op==TK_REGI
2ef0: 53 54 45 52 20 26 26 20 70 56 65 63 74 6f 72 2d  STER && pVector-
2f00: 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  >op2==TK_SELECT)
2f10: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
2f20: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e  turn pVector->x.
2f30: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
2f40: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
2f50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
2f60: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e  turn pVector->x.
2f70: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2f80: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
2f90: 65 74 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d  eturn pVector;.}
2fa0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2fb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2fc0: 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 23 69  SUBQUERY) */..#i
2fd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2fe0: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
2ff0: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
3000: 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f  urn a new Expr o
3010: 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65 6e  bject which when
3020: 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71   passed to.** sq
3030: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
3040: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c  will generate al
3050: 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65  l necessary code
3060: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   to compute.** t
3070: 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c  he iField-th col
3080: 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f  umn of the vecto
3090: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65  r expression pVe
30a0: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctor..**.** It i
30b0: 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72  s ok for pVector
30c0: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
30d0: 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65  (as long as iFie
30e0: 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20  ld==0).  .** In 
30f0: 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20  that case, this 
3100: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3110: 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  ke sqlite3ExprDu
3120: 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  p()..**.** The c
3130: 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72  aller owns the r
3140: 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a  eturned Expr obj
3150: 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f  ect and is respo
3160: 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e  nsible for.** en
3170: 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  suring that the 
3180: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65  returned value e
3190: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
31a0: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  reed..**.** The 
31b0: 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f  caller retains o
31c0: 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65 63  wnership of pVec
31d0: 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72  tor.  If pVector
31e0: 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c   is a TK_SELECT,
31f0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74  .** then the ret
3200: 75 72 6e 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c  urne object will
3210: 20 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74   reference pVect
3220: 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f  or and so pVecto
3230: 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a  r must remain.**
3240: 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c   valid for the l
3250: 69 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ife of the retur
3260: 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20  ned object.  If 
3270: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
3280: 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73  VECTOR.** or a s
3290: 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
32a0: 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65  , then it can be
32b0: 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e   deleted as soon
32c0: 20 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65   as this routine
32d0: 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  .** returns..**.
32e0: 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61  ** A trick to ca
32f0: 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  use a TK_SELECT 
3300: 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65  pVector to be de
3310: 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77  leted together w
3320: 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72  ith.** the retur
3330: 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ned Expr object 
3340: 69 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65  is to attach the
3350: 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20   pVector to the 
3360: 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20  pRight field.** 
3370: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
3380: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
3390: 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f   Expr object..*/
33a0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
33b0: 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64  prForVectorField
33c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
33d0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
33e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
33f0: 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20   Expr *pVector, 
3400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63        /* The vec
3410: 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78  tor.  List of ex
3420: 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
3430: 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  ub-SELECT */.  i
3440: 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20  nt iField       
3450: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c      /* Which col
3460: 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f  umn of the vecto
3470: 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29  r to return */.)
3480: 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a  {.  Expr *pRet;.
3490: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
34a0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
34b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63      assert( pVec
34c0: 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  tor->flags & EP_
34d0: 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20  xIsSelect );.   
34e0: 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43   /* The TK_SELEC
34f0: 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f  T_COLUMN Expr no
3500: 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de:.    **.    *
3510: 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20  * pLeft:        
3520: 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61     pVector conta
3530: 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 0a  ining TK_SELECT.
3540: 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20      ** pRight:  
3550: 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64          not used
3560: 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76 65  .  But recursive
3570: 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  ly deleted..    
3580: 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20  ** iColumn:     
3590: 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63      Index of a c
35a0: 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72  olumn in pVector
35b0: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
35c0: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
35d0: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
35e0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
35f0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3600: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3610: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3620: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3630: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3640: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3650: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3660: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3670: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3680: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3690: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
36a0: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
36b0: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
36c0: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
36d0: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
36e0: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
36f0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3700: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3710: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3720: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3730: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3740: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3750: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3760: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3770: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3780: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3790: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
37a0: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
37b0: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
37c0: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
37d0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
37e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
37f0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3800: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
3810: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
3820: 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pRet->iColumn = 
3830: 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52  iField;.      pR
3840: 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63  et->pLeft = pVec
3850: 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
3860: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c  ssert( pRet==0 |
3870: 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d  | pRet->iTable==
3880: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
3890: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
38a0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70  p==TK_VECTOR ) p
38b0: 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72  Vector = pVector
38c0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
38d0: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
38e0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
38f0: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
3900: 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20  , pVector, 0);. 
3910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
3920: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
3930: 65 66 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d 49  efine(SQLITE_OMI
3940: 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a  T_SUBQUERY) */..
3950: 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73  /*.** If express
3960: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20  ion pExpr is of 
3970: 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20  type TK_SELECT, 
3980: 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
3990: 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e   evaluate.** it.
39a0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
39b0: 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ster in which th
39c0: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
39d0: 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a  ed (or, if the .
39e0: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65  ** sub-select re
39f0: 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
3a00: 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  one column, the 
3a10: 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
3a20: 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72  y.** of register
3a30: 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72  s in which the r
3a40: 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29  esult is stored)
3a50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
3a60: 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c   is not a TK_SEL
3a70: 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ECT expression, 
3a80: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
3a90: 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65  tic int exprCode
3aa0: 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
3ab0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
3ac0: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67  Expr){.  int reg
3ad0: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
3ae0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3af0: 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  RY.  if( pExpr->
3b00: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
3b10: 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74  .    reg = sqlit
3b20: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
3b30: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
3b40: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
3b50: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d  .  return reg;.}
3b60: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
3b70: 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20   pVector points 
3b80: 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70 72  to a vector expr
3b90: 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20  ession - either 
3ba0: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
3bb0: 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74  r TK_SELECT that
3bc0: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3bd0: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54  an one column. T
3be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
3bf0: 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  urns.** the regi
3c00: 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  ster number of a
3c10: 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
3c20: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
3c30: 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  e of.** element 
3c40: 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65  iField of the ve
3c50: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ctor..**.** If p
3c60: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53  Vector is a TK_S
3c70: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3c80: 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20  , then code for 
3c90: 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a  it must have .**
3ca0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
3cb0: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 74 68  nerated using th
3cc0: 65 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  e exprCodeSubsel
3cd0: 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49  ect() routine. I
3ce0: 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70  n this.** case p
3cf0: 61 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65  arameter regSele
3d00: 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ct should be the
3d10: 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
3d20: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
3d30: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
3d40: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
3d50: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a   sub-select. .**
3d60: 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69  .** If pVector i
3d70: 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43  s of type TK_VEC
3d80: 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  TOR, then code f
3d90: 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  or the requested
3da0: 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e   field.** is gen
3db0: 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20  erated. In this 
3dc0: 63 61 73 65 20 28 2a 70 52 65 67 46 72 65 65 29  case (*pRegFree)
3dd0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 74   may be set to t
3de0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3df0: 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
3e00: 73 74 65 72 20 74 6f 20 62 65 20 66 72 65 65 64  ster to be freed
3e10: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
3e20: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
3e30: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3e40: 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20  turning, output 
3e50: 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78  parameter (*ppEx
3e60: 70 72 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f  pr) is set to po
3e70: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78  int to the.** Ex
3e80: 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  pr object corres
3e90: 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65  ponding to eleme
3ea0: 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20  nt iElem of the 
3eb0: 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  vector..*/.stati
3ec0: 63 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72  c int exprVector
3ed0: 52 65 67 69 73 74 65 72 28 0a 20 20 50 61 72 73  Register(.  Pars
3ee0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3f00: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
3f10: 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c    Expr *pVector,
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65    /* Vector to e
3f40: 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66  xtract element f
3f50: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  rom */.  int iFi
3f60: 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  eld,            
3f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c           /* Fiel
3f80: 64 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f  d to extract fro
3f90: 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69  m pVector */.  i
3fa0: 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20  nt regSelect,   
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fc0: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
3fd0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f   of registers */
3fe0: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
3ff0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4000: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65     /* OUT: Expre
4010: 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f  ssion element */
4020: 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65  .  int *pRegFree
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20     /* OUT: Temp 
4050: 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
4060: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70 20 3d   */.){.  u8 op =
4070: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20   pVector->op;.  
4080: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 56  assert( op==TK_V
4090: 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ECTOR || op==TK_
40a0: 53 45 4c 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b  SELECT || op==TK
40b0: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 69  _REGISTER );.  i
40c0: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
40d0: 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70  ER ){.    *ppExp
40e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  r = sqlite3Vecto
40f0: 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 56  rFieldSubexpr(pV
4100: 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29 3b 0a  ector, iField);.
4110: 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74      return pVect
4120: 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69 65 6c  or->iTable+iFiel
4130: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  d;.  }.  if( op=
4140: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
4150: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63    *ppExpr = pVec
4160: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
4170: 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  pEList->a[iField
4180: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65  ].pExpr;.     re
4190: 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69  turn regSelect+i
41a0: 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70  Field;.  }.  *pp
41b0: 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  Expr = pVector->
41c0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
41d0: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75  d].pExpr;.  retu
41e0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
41f0: 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a  deTemp(pParse, *
4200: 70 70 45 78 70 72 2c 20 70 52 65 67 46 72 65 65  ppExpr, pRegFree
4210: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  );.}../*.** Expr
4220: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
4230: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74  a comparison bet
4240: 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20  ween two vector 
4250: 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a  values. Compute.
4260: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
4270: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
4280: 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20  (1, 0, or NULL) 
4290: 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a  and write that.*
42a0: 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65  * result into re
42b0: 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a  gister dest..**.
42c0: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
42d0: 73 74 20 73 61 74 69 73 66 79 20 74 68 65 20 66  st satisfy the f
42e0: 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64  ollowing precond
42f0: 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  itions:.**.**   
4300: 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   if pExpr->op==T
4310: 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54  K_IS:      op==T
4320: 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c  K_EQ and p5==SQL
4330: 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20  ITE_NULLEQ.**   
4340: 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   if pExpr->op==T
4350: 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54  K_ISNOT:   op==T
4360: 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c  K_NE and p5==SQL
4370: 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20  ITE_NULLEQ.**   
4380: 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20 20   otherwise:     
4390: 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70             op==p
43a0: 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d  Expr->op and p5=
43b0: 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  =0.*/.static voi
43c0: 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70  d codeVectorComp
43d0: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
43e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
43f0: 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  Code generator c
4400: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
4410: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
4420: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
4430: 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
4440: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
4450: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
4460: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74  e results into t
4470: 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
4480: 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20    u8 op,        
4490: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
44a0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a  rison operator *
44b0: 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
44c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
44d0: 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65  ITE_NULLEQ or ze
44e0: 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ro */.){.  Vdbe 
44f0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4500: 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  be;.  Expr *pLef
4510: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
4520: 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  ;.  Expr *pRight
4530: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
4540: 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20  ;.  int nLeft = 
4550: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
4560: 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
4570: 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 73 71 6c  int nRight = sql
4580: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
4590: 7a 65 28 70 52 69 67 68 74 29 3b 0a 0a 20 20 2f  ze(pRight);..  /
45a0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74  * Check that bot
45b0: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
45c0: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 76 65  omparison are ve
45d0: 63 74 6f 72 73 2c 20 61 6e 64 20 74 68 61 74 0a  ctors, and that.
45e0: 20 20 2a 2a 20 62 6f 74 68 20 61 72 65 20 74 68    ** both are th
45f0: 65 20 73 61 6d 65 20 6c 65 6e 67 74 68 2e 20 20  e same length.  
4600: 2a 2f 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d  */.  if( nLeft!=
4610: 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  nRight ){.    sq
4620: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4630: 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
4640: 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 65   misused");.  }e
4650: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
4660: 20 20 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20      int regLeft 
4670: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
4680: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 75  Right = 0;.    u
4690: 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20  8 opx = op;.    
46a0: 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20 73  int addrDone = s
46b0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
46c0: 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 61 73 73  bel(v);..    ass
46d0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
46e0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
46f0: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
4700: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4710: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
4720: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a  ->op==TK_ISNOT .
4730: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
4740: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op==TK_LT || 
4750: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
4760: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45   .         || pE
4770: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
4780: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4790: 47 45 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  GE .    );.    a
47a0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
47b0: 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e  ==op || (pExpr->
47c0: 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d  op==TK_IS && op=
47d0: 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20  =TK_EQ).        
47e0: 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d        || (pExpr-
47f0: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26  >op==TK_ISNOT &&
4800: 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20   op==TK_NE) );. 
4810: 20 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 30     assert( p5==0
4820: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f   || pExpr->op!=o
4830: 70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  p );.    assert(
4840: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
4850: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
4860: 3d 6f 70 20 29 3b 0a 0a 20 20 20 20 70 35 20 7c  =op );..    p5 |
4870: 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  = SQLITE_STOREP2
4880: 3b 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54  ;.    if( opx==T
4890: 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f  K_LE ) opx = TK_
48a0: 4c 54 3b 0a 20 20 20 20 69 66 28 20 6f 70 78 3d  LT;.    if( opx=
48b0: 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54  =TK_GE ) opx = T
48c0: 4b 5f 47 54 3b 0a 0a 20 20 20 20 72 65 67 4c 65  K_GT;..    regLe
48d0: 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ft = exprCodeSub
48e0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
48f0: 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 67 52 69  Left);.    regRi
4900: 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75  ght = exprCodeSu
4910: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
4920: 70 52 69 67 68 74 29 3b 0a 0a 20 20 20 20 66 6f  pRight);..    fo
4930: 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20  r(i=0; 1 /*Loop 
4940: 65 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22  exits by "break"
4950: 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  */; i++){.      
4960: 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
4970: 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  , regFree2 = 0;.
4980: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20        Expr *pL, 
4990: 2a 70 52 3b 20 0a 20 20 20 20 20 20 69 6e 74 20  *pR; .      int 
49a0: 72 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 61 73  r1, r2;.      as
49b0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
49c0: 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  nLeft );.      i
49d0: 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33  f( i>0 ) sqlite3
49e0: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
49f0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 31 20  arse);.      r1 
4a00: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4a10: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ster(pParse, pLe
4a20: 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20  ft, i, regLeft, 
4a30: 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b  &pL, &regFree1);
4a40: 0a 20 20 20 20 20 20 72 32 20 3d 20 65 78 70 72  .      r2 = expr
4a50: 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70  VectorRegister(p
4a60: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69  Parse, pRight, i
4a70: 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c  , regRight, &pR,
4a80: 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
4a90: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
4aa0: 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f  Parse, pL, pR, o
4ab0: 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74  px, r1, r2, dest
4ac0: 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 74 65 73  , p5);.      tes
4ad0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
4ae0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4af0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
4b00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4b10: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4b20: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4b30: 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Le);.      tes
4b40: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
4b50: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4b60: 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
4b70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4b80: 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
4b90: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4ba0: 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ge);.      tes
4bb0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
4bc0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4bd0: 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
4be0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4bf0: 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
4c00: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4c10: 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  P_Ne);.      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 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
4c50: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4c60: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
4c70: 65 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e2);.      if( i
4c80: 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  >0 ) sqlite3Expr
4c90: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
4ca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e  ;.      if( i==n
4cb0: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4cc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4cd0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 78 3d 3d  .      if( opx==
4ce0: 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  TK_EQ ){.       
4cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d00: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
4d10: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
4d20: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4d30: 3b 0a 20 20 20 20 20 20 20 20 70 35 20 7c 3d 20  ;.        p5 |= 
4d40: 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b  SQLITE_KEEPNULL;
4d50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4d60: 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20   opx==TK_NE ){. 
4d70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4d80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4d90: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
4da0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4db0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35 20  (v);.        p5 
4dc0: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4dd0: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LL;.      }else{
4de0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4df0: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
4e00: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
4e10: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
4e20: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  E );.        sql
4e30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4e40: 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20  , OP_ElseNotEq, 
4e50: 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20  0, addrDone);.  
4e60: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4e70: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4e80: 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  T);.        Vdbe
4e90: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
4ea0: 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
4eb0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4ec0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  (v, op==TK_LE);.
4ed0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
4ee0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4ef0: 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  _GE);.        if
4f00: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4f10: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 7d  px = op;.      }
4f20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4f30: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4f40: 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b  el(v, addrDone);
4f50: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  .  }.}..#if SQLI
4f60: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
4f70: 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  H>0./*.** Check 
4f80: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48  that argument nH
4f90: 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68  eight is less th
4fa0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
4fb0: 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78  he maximum.** ex
4fc0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61  pression depth a
4fd0: 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73  llowed. If it is
4fe0: 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65   not, leave an e
4ff0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a  rror message in.
5000: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e  ** pParse..*/.in
5010: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
5020: 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  ckHeight(Parse *
5030: 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69  pParse, int nHei
5040: 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ght){.  int rc =
5050: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
5060: 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61  t mxHeight = pPa
5070: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
5080: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
5090: 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20  R_DEPTH];.  if( 
50a0: 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74  nHeight>mxHeight
50b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
50c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
50d0: 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73  .       "Express
50e0: 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20  ion tree is too 
50f0: 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64  large (maximum d
5100: 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69  epth %d)", mxHei
5110: 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ght.    );.    r
5120: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
5130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5140: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c  c;.}../* The fol
5150: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
5160: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
5170: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
5180: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
5190: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
51a0: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
51b0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
51c0: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
51d0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
51e0: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
51f0: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
5200: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
5210: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
5220: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
5230: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
5240: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
5250: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
5260: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
5270: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
5280: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
5290: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
52a0: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
52b0: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
52c0: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
52d0: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
52e0: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
52f0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
5300: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
5310: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
5320: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
5330: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
5340: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
5350: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5360: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
5370: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
5380: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
5390: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
53a0: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
53b0: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
53c0: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
53d0: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
53e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
53f0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
5400: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
5410: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5420: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5430: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5440: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
5450: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
5460: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
5470: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5480: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5490: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
54a0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
54b0: 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70  pr(p->pOffset, p
54c0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
54d0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
54e0: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
54f0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5500: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
5510: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
5520: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5530: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
5540: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5550: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
5560: 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48  t(p->pPrior, pnH
5570: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eight);.  }.}../
5580: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
5590: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
55a0: 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  le in the struct
55b0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e  ure passed as an
55c0: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41   .** argument. A
55d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  n expression wit
55e0: 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45  h no children, E
55f0: 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a  xpr.pList or .**
5600: 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65   Expr.pSelect me
5610: 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68  mber has a heigh
5620: 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65  t of 1. Any othe
5630: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
5640: 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75  has a height equ
5650: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
5660: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
5670: 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65  other .** refere
5680: 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f  nced Expr plus o
5690: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70  ne..**.** Also p
56a0: 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70  ropagate EP_Prop
56b0: 61 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66  agate flags up f
56c0: 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  rom Expr.x.pList
56d0: 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a   to Expr.flags,.
56e0: 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  ** if appropriat
56f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5700: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
5710: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
5720: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
5730: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5740: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
5750: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
5760: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
5770: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
5780: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5790: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
57a0: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
57b0: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
57c0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
57d0: 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69  lse if( p->x.pLi
57e0: 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  st ){.    height
57f0: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e  OfExprList(p->x.
5800: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
5810: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  ;.    p->flags |
5820: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
5830: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5840: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
5850: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69  );.  }.  p->nHei
5860: 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20  ght = nHeight + 
5870: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
5880: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
5890: 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20   variable using 
58a0: 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68  the exprSetHeigh
58b0: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  t() function. If
58c0: 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69  .** the height i
58d0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
58e0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
58f0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ed expression de
5900: 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  pth,.** leave an
5910: 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
5920: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5930: 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72  pagate all EP_Pr
5940: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72  opagate flags fr
5950: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
5960: 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72  ist into.** Expr
5970: 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64  .flags. .*/.void
5980: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
5990: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61  eightAndFlags(Pa
59a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
59b0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61  r *p){.  if( pPa
59c0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
59d0: 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69  rn;.  exprSetHei
59e0: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
59f0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
5a00: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
5a10: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
5a20: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
5a30: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
5a40: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
5a50: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
5a60: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
5a70: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
5a80: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
5a90: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
5aa0: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
5ab0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
5ac0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5ad0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
5ae0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
5af0: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
5b00: 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48  lse /* ABOVE:  H
5b10: 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e  eight enforcemen
5b20: 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f  t enabled.  BELO
5b30: 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63  W: Height enforc
5b40: 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a  ement off */./*.
5b50: 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c  ** Propagate all
5b60: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5b70: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5b80: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
5b90: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
5ba0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5bb0: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
5bc0: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
5bd0: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
5be0: 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69  f( p && p->x.pLi
5bf0: 73 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72  st && !ExprHasPr
5c00: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5c10: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70  Select) ){.    p
5c20: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
5c30: 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65  opagate & sqlite
5c40: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
5c50: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  ->x.pList);.  }.
5c60: 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65  }.#define exprSe
5c70: 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69  tHeight(y).#endi
5c80: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
5c90: 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a  EXPR_DEPTH>0 */.
5ca0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5cb0: 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20  ine is the core 
5cc0: 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78  allocator for Ex
5cd0: 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20  pr nodes..**.** 
5ce0: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
5cf0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
5d00: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
5d10: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
5d20: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
5d30: 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65  node and for the
5d40: 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74   pToken argument
5d50: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c   is a single all
5d60: 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69  ocation.** obtai
5d70: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
5d80: 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65  DbMalloc().  The
5d90: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
5da0: 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  n.** is responsi
5db0: 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
5dc0: 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65  ure the node eve
5dd0: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
5de0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71  ed..**.** If deq
5df0: 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68  uote is true, th
5e00: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66  en the token (if
5e10: 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64   it exists) is d
5e20: 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64  equoted..** If d
5e30: 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c  equote is false,
5e40: 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73   no dequoting is
5e50: 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65   performed.  The
5e60: 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61   deQuote.** para
5e70: 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
5e80: 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
5e90: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b  LL or if the tok
5ea0: 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61  en does not.** a
5eb0: 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74  ppear to be quot
5ec0: 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74  ed.  If the quot
5ed0: 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66  es were of the f
5ee0: 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c  orm "..." (doubl
5ef0: 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65  e-quotes).** the
5f00: 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74  n the EP_DblQuot
5f10: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  ed flag is set o
5f20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
5f30: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65   node..**.** Spe
5f40: 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f  cial case:  If o
5f50: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e  p==TK_INTEGER an
5f60: 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20  d pToken points 
5f70: 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
5f80: 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73  .** can be trans
5f90: 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d  lated into a 32-
5fa0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65  bit integer, the
5fb0: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e  n the token is n
5fc0: 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ot.** stored in 
5fd0: 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65  u.zToken.  Inste
5fe0: 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20  ad, the integer 
5ff0: 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65  values is writte
6000: 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c  n.** into u.iVal
6010: 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e  ue and the EP_In
6020: 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73  tValue flag is s
6030: 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74  et.  No extra st
6040: 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f  orage.** is allo
6050: 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
6060: 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61  e integer text a
6070: 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66  nd the dequote f
6080: 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  lag is ignored..
6090: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
60a0: 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c  ExprAlloc(.  sql
60b0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
60c0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
60d0: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
60e0: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
60f0: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6100: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6110: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6120: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6130: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
6140: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
6150: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
6160: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
6170: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
6180: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6190: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
61a0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
61b0: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
61c0: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
61d0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
61e0: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
61f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6200: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
6210: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
6220: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
6230: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
6240: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
6250: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
6260: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
6270: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
6280: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
6290: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
62a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
62b0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
62c0: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
62d0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
62e0: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
62f0: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6300: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
6310: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
6320: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
6330: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
6340: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
6350: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
6360: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
6370: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
6380: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
6390: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
63a0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
63b0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
63c0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
63d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
63e0: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
63f0: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
6400: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
6410: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
6420: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
6430: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
6440: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
6450: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
6460: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
6470: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
6480: 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28   sqlite3Isquote(
6490: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  pNew->u.zToken[0
64a0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
64b0: 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  if( pNew->u.zTok
64c0: 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65  en[0]=='"' ) pNe
64d0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
64e0: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
64f0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
6500: 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  te(pNew->u.zToke
6510: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
6520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
6530: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
6540: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
6550: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
6560: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
6570: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
6580: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
6590: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
65a0: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
65b0: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
65c0: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
65d0: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
65e0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
65f0: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
6600: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6610: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6620: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6630: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
6640: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
6650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6660: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
6670: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
6680: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
6690: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
66a0: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
66b0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
66c0: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
66d0: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
66e0: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
66f0: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
6700: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
6710: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
6720: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
6730: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
6740: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6750: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
6760: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
6770: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
6780: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
6790: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
67a0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
67b0: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
67c0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
67d0: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
67e0: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
67f0: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
6800: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
6810: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
6820: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
6830: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
6840: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
6850: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
6860: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
6870: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
6880: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
6890: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
68a0: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
68b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
68c0: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
68d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
68e0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
68f0: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
6900: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f  Right;.      pRo
6910: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6920: 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67  Propagate & pRig
6930: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
6940: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
6950: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
6960: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
6970: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
6980: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6990: 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b   & pLeft->flags;
69a0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53  .    }.    exprS
69b0: 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b  etHeight(pRoot);
69c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
69d0: 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e  locate an Expr n
69e0: 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20  ode which joins 
69f0: 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73  as many as two s
6a00: 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  ubtrees..**.** O
6a10: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
6a20: 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62  e subtrees can b
6a30: 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20  e NULL.  Return 
6a40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6a50: 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64   new.** Expr nod
6a60: 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  e.  Or, if an OO
6a70: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
6a80: 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  set pParse->db->
6a90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a  mallocFailed,.**
6aa0: 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65   free the subtre
6ab0: 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  es and return NU
6ac0: 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  LL..*/.Expr *sql
6ad0: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
6ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6af0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
6b00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6b10: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6b20: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6b30: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
6b40: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
6b50: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
6b60: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
6b70: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
6b80: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
6b90: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
6ba0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
6bb0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
6bc0: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
6bd0: 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54   *p;.  if( op==T
6be0: 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d  K_AND && pParse-
6bf0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
6c00: 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67  /* Take advantag
6c10: 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75  e of short-circu
6c20: 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a  it false optimiz
6c30: 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f  ation for AND */
6c40: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6c50: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
6c60: 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  db, pLeft, pRigh
6c70: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6c80: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
6c90: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
6ca0: 2c 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53  , op & TKFLG_MAS
6cb0: 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  K, pToken, 1);. 
6cc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6cd0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6ce0: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6cf0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
6d00: 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20    if( p ) {.    
6d10: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6d20: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6d30: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  ->nHeight);.  }.
6d40: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6d50: 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74  *.** Add pSelect
6d60: 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70   to the Expr.x.p
6d70: 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f  Select field.  O
6d80: 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  r, if pExpr is N
6d90: 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61  ULL (due.** do a
6da0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6db0: 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e  on failure) then
6dc0: 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c   delete the pSel
6dd0: 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
6de0: 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72  oid sqlite3PExpr
6df0: 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20  AddSelect(Parse 
6e00: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
6e10: 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  Expr, Select *pS
6e20: 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45  elect){.  if( pE
6e30: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
6e40: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  ->x.pSelect = pS
6e50: 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53  elect;.    ExprS
6e60: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
6e70: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45  , EP_xIsSelect|E
6e80: 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20  P_Subquery);.   
6e90: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
6ea0: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50  eightAndFlags(pP
6eb0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
6ec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6ed0: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
6ee0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6ef0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
6f00: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6f10: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  b, pSelect);.  }
6f20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6f30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6f40: 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52  always either TR
6f50: 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73  UE or FALSE (res
6f60: 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74  pectively),.** t
6f70: 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49  hen return 1.  I
6f80: 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74  f one cannot det
6f90: 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68  ermine the truth
6fa0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
6fb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63   expression at c
6fc0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75  ompile-time retu
6fd0: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rn 0..**.** This
6fe0: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
6ff0: 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74  ion.  If is OK t
7000: 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  o return 0 here 
7010: 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65  even if.** the e
7020: 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79  xpression really
7030: 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65   is always false
7040: 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c   or false (a fal
7050: 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a  se negative)..**
7060: 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67   But it is a bug
7070: 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20   to return 1 if 
7080: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
7090: 69 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72  ight have differ
70a0: 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ent.** boolean v
70b0: 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65  alues in differe
70c0: 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  nt circumstances
70d0: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
70e0: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
70f0: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
7100: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
7110: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
7120: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
7130: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
7140: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
7150: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
7160: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
7170: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
7180: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
7190: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
71a0: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72  int exprAlwaysTr
71b0: 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ue(Expr *p){.  i
71c0: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  nt v = 0;.  if( 
71d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
71e0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
71f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
7200: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
7210: 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29  Integer(p, &v) )
7220: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
7230: 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74  urn v!=0;.}.stat
7240: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
7250: 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b  sFalse(Expr *p){
7260: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7270: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7280: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7290: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
72a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
72b0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
72c0: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
72d0: 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a   return v==0;.}.
72e0: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
72f0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
7300: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
7310: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
7320: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
7330: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
7340: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
7350: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
7360: 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  * If one side or
7370: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
7380: 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74  e AND is known t
7390: 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e  o be false, then
73a0: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72   instead.** of r
73b0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20  eturning an AND 
73c0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74  expression, just
73d0: 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61   return a consta
73e0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  nt expression wi
73f0: 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66  th.** a value of
7400: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20   false..*/.Expr 
7410: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28  *sqlite3ExprAnd(
7420: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7430: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
7440: 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  pRight){.  if( p
7450: 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Left==0 ){.    r
7460: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
7470: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
7480: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7490: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
74a0: 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
74b0: 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65  alse(pLeft) || e
74c0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
74d0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
74e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
74f0: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
7500: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7510: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
7520: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
7530: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7540: 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
7550: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c  te3IntTokens[0],
7560: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
7570: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
7580: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7590: 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30  db, TK_AND, 0, 0
75a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
75b0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
75c0: 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74  (db, pNew, pLeft
75d0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  , pRight);.    r
75e0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a  eturn pNew;.  }.
75f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
7600: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
7610: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
7620: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
7630: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
7640: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
7650: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
7660: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7670: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
7680: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
7690: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
76a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
76b0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
76c0: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
76d0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
76e0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
76f0: 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e  FUNCTION, pToken
7700: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 1);.  if( pNew
7710: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7720: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
7730: 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20  (db, pList); /* 
7740: 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61  Avoid memory lea
7750: 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  k when malloc fa
7760: 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ils */.    retur
7770: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  n 0;.  }.  pNew-
7780: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7790: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
77a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
77b0: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
77c0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
77d0: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
77e0: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
77f0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7810: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7820: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7830: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7840: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7850: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7860: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7870: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7880: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7890: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
78a0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
78b0: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
78c0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
78d0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
78e0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
78f0: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7900: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
7910: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7920: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7930: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
7940: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
7950: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
7960: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
7970: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
7980: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
7990: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
79a0: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
79b0: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
79c0: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
79d0: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
79e0: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
79f0: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
7a00: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
7a10: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
7a20: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
7a30: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
7a40: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
7a50: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7a60: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
7a70: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
7a80: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7a90: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
7aa0: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
7ab0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7ac0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7ad0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7ae0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7af0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7b00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7b10: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7b20: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
7b30: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
7b40: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
7b50: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
7b60: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
7b70: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
7b80: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
7b90: 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20  ;.  if( z[1]==0 
7ba0: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
7bb0: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7bc0: 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20  ?".  Assign the 
7bd0: 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75  next variable nu
7be0: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  mber */.    asse
7bf0: 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b  rt( z[0]=='?' );
7c00: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
7c10: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  umn = (ynVar)(++
7c20: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
7c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61   }else{.    ynVa
7c40: 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32  r x = 0;.    u32
7c50: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
7c60: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
7c70: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
7c80: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7ca0: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
7cb0: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
7cc0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
7cd0: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
7ce0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
7cf0: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
7d00: 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73    int bOk = 0==s
7d10: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
7d20: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
7d30: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
7d40: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
7d50: 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a  = x = (ynVar)i;.
7d60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7d70: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
7d80: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
7d90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7da0: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
7db0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7dc0: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
7dd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7de0: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
7df0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7e00: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
7e10: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
7e20: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
7e30: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7e40: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7e50: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
7e60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7e70: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
7e80: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
7e90: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
7ea0: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
7eb0: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
7ec0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7ed0: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
7ee0: 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20        x = 0;.   
7ef0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
7f00: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
7f10: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
7f20: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a  >nVar = (int)i;.
7f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
7f40: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64  e{.      /* Wild
7f50: 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61  cards like ":aaa
7f60: 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61  ", "$aaa" or "@a
7f70: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
7f80: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
7f90: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
7fa0: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
7fb0: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
7fc0: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
7fd0: 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e name.      ** 
7fe0: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
7ff0: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
8000: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
8010: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  le number.      
8020: 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69  */.      ynVar i
8030: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
8040: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   i<pParse->nzVar
8050: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8060: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  if( pParse->azVa
8070: 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70  r[i] && strcmp(p
8080: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c  Parse->azVar[i],
8090: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
80a0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
80b0: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
80c0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
80d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
80e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
80f0: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
8100: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
8110: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
8120: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
8130: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
8140: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
8150: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
8160: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
8170: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
8180: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
8190: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
81a0: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
81b0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
81c0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
81d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
81e0: 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20 72 65  d ); /* Error re
81f0: 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20 6d  ported through m
8200: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20  allocFailed */. 
8210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
8220: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8230: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
8240: 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65   = a;.        me
8250: 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e  mset(&a[pParse->
8260: 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50  nzVar], 0, (x-pP
8270: 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a  arse->nzVar)*siz
8280: 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20  eof(a[0]));.    
8290: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61      pParse->nzVa
82a0: 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20  r = x;.      }. 
82b0: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27       if( z[0]!='
82c0: 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a  ?' || pParse->az
82d0: 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20  Var[x-1]==0 ){. 
82e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
82f0: 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d  Free(db, pParse-
8300: 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20  >azVar[x-1]);.  
8310: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
8320: 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74  Var[x-1] = sqlit
8330: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
8340: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
8350: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20     }.  } .  if( 
8360: 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26  !pParse->nErr &&
8370: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62   pParse->nVar>db
8380: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8390: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
83a0: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71  UMBER] ){.    sq
83b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
83c0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
83d0: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b  SQL variables");
83e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
83f0: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
8400: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
8410: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ree..*/.static S
8420: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
8430: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
8440: 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20  eleteNN(sqlite3 
8450: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
8460: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
8470: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
8480: 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20  ck: Assert that 
8490: 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20  the IntValue is 
84a0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20  non-negative if 
84b0: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61  it exists */.  a
84c0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
84d0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
84e0: 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e  tValue) || p->u.
84f0: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69  iValue>=0 );.  i
8500: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8510: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8520: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nly) ){.    /* T
8530: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
8540: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
8550: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
8560: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
8570: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8580: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
8590: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
85a0: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
85b0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
85c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
85d0: 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  e(db, p->pLeft);
85e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
85f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52  Delete(db, p->pR
8600: 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
8610: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8620: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
8630: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8640: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
8650: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
8660: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8670: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
8680: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
8690: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
86a0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
86b0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
86c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
86d0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
86e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
86f0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8700: 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29  ty(p, EP_Static)
8710: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
8720: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
8730: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
8740: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
8750: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
8760: 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69  {.  if( p ) sqli
8770: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8780: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
8790: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
87a0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
87b0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
87c0: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
87d0: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
87e0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
87f0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
8800: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
8810: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
8820: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
8830: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
8840: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
8850: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
8860: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
8870: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8880: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
8890: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
88a0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
88b0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
88c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
88d0: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
88e0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
88f0: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
8900: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
8910: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
8920: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
8930: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
8940: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
8950: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
8960: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
8970: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
8980: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
8990: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
89a0: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
89b0: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
89c0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
89d0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
89e0: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
89f0: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
8a00: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
8a10: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
8a20: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
8a30: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
8a40: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
8a50: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
8a60: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
8a70: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
8a80: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
8a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
8ae0: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
8af0: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
8b00: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
8b10: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
8b20: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
8b30: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
8b40: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
8b50: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
8b60: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
8b70: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
8b80: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
8b90: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
8ba0: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
8bb0: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
8bc0: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
8bd0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
8be0: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
8bf0: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
8c00: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8c10: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
8c20: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
8c30: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
8c40: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
8c50: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8c60: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
8c70: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
8c80: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
8c90: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
8ca0: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
8cb0: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
8cc0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
8cd0: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
8ce0: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
8cf0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
8d00: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
8d10: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
8d20: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
8d30: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
8d40: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
8d50: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
8d60: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
8d70: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
8d80: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
8d90: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
8da0: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
8db0: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
8dc0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
8dd0: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
8de0: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
8df0: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
8e00: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
8e10: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
8e20: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
8e30: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
8e40: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
8e50: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
8e60: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
8e70: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
8e80: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20  k to.** make an 
8e90: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63  EXPRDUP_REDUCE c
8ea0: 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64  opy of a reduced
8eb0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74   expression.  It
8ec0: 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a   is only legal.*
8ed0: 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72  * to reduce a pr
8ee0: 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f  istine expressio
8ef0: 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20  n tree from the 
8f00: 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70  parser.  The imp
8f10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f  lementation.** o
8f20: 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  f dupedExprStruc
8f30: 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20  tSize() contain 
8f40: 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28  multiple assert(
8f50: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
8f60: 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  t attempt.** to 
8f70: 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e  enforce this con
8f80: 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  straint..*/.stat
8f90: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
8fa0: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
8fb0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
8fc0: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61    int nSize;.  a
8fd0: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58  ssert( flags==EX
8fe0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20  PRDUP_REDUCE || 
8ff0: 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f  flags==0 ); /* O
9000: 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c  nly one flag val
9010: 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  ue allowed */.  
9020: 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c  assert( EXPR_FUL
9030: 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a  LSIZE<=0xfff );.
9040: 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66    assert( (0xfff
9050: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
9060: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30  P_TokenOnly))==0
9070: 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61   );.  if( 0==fla
9080: 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  gs ){.    nSize 
9090: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
90a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
90b0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
90c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
90d0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
90e0: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
90f0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9100: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
9110: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
9120: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9130: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
9140: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
9150: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9160: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
9170: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
9180: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
9190: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
91a0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
91b0: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
91c0: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
91d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
91e0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
91f0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
9200: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
9210: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
9220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9230: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
9240: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9250: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
9260: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
9270: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
9280: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
9290: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
92a0: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
92b0: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
92c0: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
92d0: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
92e0: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
92f0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
9300: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
9310: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
9320: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
9330: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
9340: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
9350: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
9360: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
9370: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
9380: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
9390: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
93a0: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
93b0: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
93c0: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
93d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
93e0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
93f0: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
9400: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
9410: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
9420: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
9430: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
9440: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
9450: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
9460: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
9470: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
9480: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
9490: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
94a0: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
94b0: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
94c0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
94d0: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
94e0: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
94f0: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
9500: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
9510: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
9520: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
9530: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
9540: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
9550: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
9560: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
9570: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
9580: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
9590: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
95a0: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
95b0: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
95c0: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
95d0: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
95e0: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
95f0: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
9600: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
9610: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
9620: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
9630: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
9640: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
9650: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
9660: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
9670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
9680: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
9690: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
96a0: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
96b0: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
96c0: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
96d0: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
96e0: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
96f0: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
9700: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
9710: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
9720: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
9730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9740: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
9750: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
9760: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
9770: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
9780: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
9790: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
97a0: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
97b0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
97c0: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
97d0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
97e0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
97f0: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
9800: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
9810: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
9820: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
9830: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
9840: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
9850: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
9860: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
9870: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
9880: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
9890: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
98a0: 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20  e.** portion of 
98b0: 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65  the buffer copie
98c0: 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66  d into by this f
98d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
98e0: 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70  ic Expr *exprDup
98f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
9900: 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c  pr *p, int dupFl
9910: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
9920: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
9930: 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
9940: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
9950: 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b  */.  u8 *zAlloc;
9960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
9970: 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20  mory space from 
9980: 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45  which to build E
9990: 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  xpr object */.  
99a0: 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20  u32 staticFlag; 
99b0: 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74        /* EP_Stat
99c0: 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20  ic if space not 
99d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
99e0: 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72  lloc */..  asser
99f0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
9a00: 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73  sert( p );.  ass
9a10: 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30  ert( dupFlags==0
9a20: 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58   || dupFlags==EX
9a30: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
9a40: 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66    assert( pzBuff
9a50: 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  er==0 || dupFlag
9a60: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
9a70: 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  E );..  /* Figur
9a80: 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77  e out where to w
9a90: 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70  rite the new Exp
9aa0: 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  r structure. */.
9ab0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
9ac0: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a  {.    zAlloc = *
9ad0: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74  pzBuffer;.    st
9ae0: 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74  aticFlag = EP_St
9af0: 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  atic;.  }else{. 
9b00: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
9b10: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
9b20: 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69  (db, dupedExprSi
9b30: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29  ze(p, dupFlags))
9b40: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
9b50: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
9b60: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
9b70: 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29  c;..  if( pNew )
9b80: 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65  {.    /* Set nNe
9b90: 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  wSize to the siz
9ba0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
9bb0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
9bc0: 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  inted to.    ** 
9bd0: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
9be0: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
9bf0: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
9c00: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a  CEDSIZE or.    *
9c10: 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  * EXPR_TOKENONLY
9c20: 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20  SIZE. nToken is 
9c30: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
9c40: 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75  r of bytes consu
9c50: 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  med.    ** by th
9c60: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d  e copy of the p-
9c70: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
9c80: 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
9c90: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
9ca0: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
9cb0: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
9cc0: 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  ctSize(p, dupFla
9cd0: 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  gs);.    const i
9ce0: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
9cf0: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
9d00: 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  f;.    int nToke
9d10: 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  n;.    if( !Expr
9d20: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9d30: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
9d40: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
9d50: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c      nToken = sql
9d60: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9d70: 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20  u.zToken) + 1;. 
9d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9d90: 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nToken = 0;.    
9da0: 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61  }.    if( dupFla
9db0: 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gs ){.      asse
9dc0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
9dd0: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
9de0: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d  d)==0 );.      m
9df0: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
9e00: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
9e10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
9e20: 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78   nSize = (u32)ex
9e30: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
9e40: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
9e50: 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b  lloc, p, nSize);
9e60: 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65  .      if( nSize
9e70: 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29  <EXPR_FULLSIZE )
9e80: 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  { .        memse
9e90: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
9ea0: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
9eb0: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
9ec0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
9ed0: 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75   Set the EP_Redu
9ee0: 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ced, EP_TokenOnl
9ef0: 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63  y, and EP_Static
9f00: 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61   flags appropria
9f10: 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65  tely. */.    pNe
9f20: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
9f30: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9f40: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
9f50: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
9f60: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
9f70: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
9f80: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9f90: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e  kenOnly);.    pN
9fa0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
9fb0: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a  ticFlag;..    /*
9fc0: 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a   Copy the p->u.z
9fd0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66  Token string, if
9fe0: 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
9ff0: 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   nToken ){.     
a000: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20   char *zToken = 
a010: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
a020: 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b   (char*)&zAlloc[
a030: 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20  nNewSize];.     
a040: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
a050: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
a060: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ken);.    }..   
a070: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
a080: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
a090: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
a0a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ){.      /* Fill
a0b0: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
a0c0: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
a0d0: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
a0e0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
a0f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a100: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a110: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a120: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
a130: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a140: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
a150: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a170: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
a180: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a190: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
a1a0: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a1b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
a1c0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
a1d0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
a1e0: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
a1f0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a200: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
a210: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a220: 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  y) ){.      zAll
a230: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a240: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a250: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a260: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a270: 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64  pNew, EP_Reduced
a280: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a290: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c  w->pLeft = p->pL
a2a0: 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  eft ?.          
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
a2c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  Dup(db, p->pLeft
a2d0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
a2e0: 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a  , &zAlloc) : 0;.
a2f0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52          pNew->pR
a300: 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74  ight = p->pRight
a310: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a320: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
a330: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
a340: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
a350: 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20   &zAlloc) : 0;. 
a360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a370: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
a380: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
a390: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d   zAlloc;.      }
a3a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a3b0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
a3c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
a3d0: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
a3e0: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d     if( pNew->op=
a3f0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
a400: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  N ){.          p
a410: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
a420: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 7d  pLeft;.        }
a430: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a440: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
a450: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a460: 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20   p->pLeft, 0);. 
a470: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a480: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
a490: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a4a0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29  b, p->pRight, 0)
a4b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a4c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
a4d0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  w;.}../*.** Crea
a4e0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
a4f0: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
a500: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a510: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
a520: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e   argument. If an
a530: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69   OOM condition i
a540: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e  s encountered, N
a550: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ULL is returned.
a560: 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d  ** and the db->m
a570: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
a580: 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   set..*/.#ifndef
a590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
a5a0: 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69  .static With *wi
a5b0: 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  thDup(sqlite3 *d
a5c0: 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57  b, With *p){.  W
a5d0: 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ith *pRet = 0;. 
a5e0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
a5f0: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
a600: 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d  (*p) + sizeof(p-
a610: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74  >a[0]) * (p->nCt
a620: 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  e-1);.    pRet =
a630: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
a640: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
a650: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
a660: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a670: 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d      pRet->nCte =
a680: 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20   p->nCte;.      
a690: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
a6a0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
a6b0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65    pRet->a[i].pSe
a6c0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
a6d0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  lectDup(db, p->a
a6e0: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  [i].pSelect, 0);
a6f0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
a700: 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69  [i].pCols = sqli
a710: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
a720: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  b, p->a[i].pCols
a730: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
a740: 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  et->a[i].zName =
a750: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a760: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  (db, p->a[i].zNa
a770: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
a780: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a790: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  pRet;.}.#else.# 
a7a0: 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78  define withDup(x
a7b0: 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y) 0.#endif../*
a7c0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a7d0: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
a7e0: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
a7f0: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
a800: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
a810: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
a820: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
a830: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
a840: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
a850: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
a860: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
a870: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
a880: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
a890: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
a8a0: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
a8b0: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
a8c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
a8d0: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
a8e0: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
a8f0: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
a900: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
a910: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
a920: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
a930: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
a940: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
a950: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
a960: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
a970: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
a980: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
a990: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
a9a0: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
a9b0: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
a9c0: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
a9d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
a9e0: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
a9f0: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
aa00: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
aa10: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49  _XXX flags..** I
aa20: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
aa30: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
aa40: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
aa50: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
aa60: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
aa70: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
aa80: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
aa90: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
aaa0: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
aab0: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
aac0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
aad0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
aae0: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
aaf0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
ab00: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
ab10: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
ab20: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66  gs){.  assert( f
ab30: 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
ab40: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
ab50: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f   );.  return p ?
ab60: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
ab70: 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d  flags, 0) : 0;.}
ab80: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
ab90: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71  e3ExprListDup(sq
aba0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
abb0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
abc0: 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  s){.  ExprList *
abd0: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
abe0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
abf0: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
ac00: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
ac10: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
ac20: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
ac30: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
ac40: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
ac50: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
ac60: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
ac70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ac80: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
ac90: 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  i = p->nExpr;.  
aca0: 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50  if( (flags & EXP
acb0: 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20  RDUP_REDUCE)==0 
acc0: 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e  ) for(i=1; i<p->
acd0: 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20  nExpr; i+=i){}. 
ace0: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
acf0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
ad00: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73  ocRawNN(db,  i*s
ad10: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
ad20: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
ad30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
ad40: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
ad50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ad60: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
ad70: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
ad80: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
ad90: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
ada0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
adb0: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
adc0: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
add0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
ade0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
adf0: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
ae00: 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d  lags);.    pItem
ae10: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
ae20: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
ae30: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
ae40: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
ae50: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
ae60: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
ae70: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
ae80: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
ae90: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
aea0: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
aeb0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
aec0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20  tem->bSpanIsTab 
aed0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61  = pOldItem->bSpa
aee0: 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65  nIsTab;.    pIte
aef0: 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  m->u = pOldItem-
af00: 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >u;.  }.  return
af10: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
af20: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
af30: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
af40: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
af50: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
af60: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
af70: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
af80: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
af90: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
afa0: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
afb0: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
afc0: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
afd0: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
afe0: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
aff0: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
b000: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
b010: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b020: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
b030: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
b040: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
b050: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b060: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
b070: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
b080: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
b090: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
b0a0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
b0b0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
b0c0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
b0d0: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  te;.  assert( db
b0e0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b0f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b100: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
b110: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
b120: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
b130: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
b140: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
b150: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b160: 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  wNN(db, nByte );
b170: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b180: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b190: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
b1a0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
b1b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b1c0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
b1d0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
b1e0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
b1f0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
b200: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b210: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
b220: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
b230: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b240: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68    pNewItem->pSch
b250: 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ema = pOldItem->
b260: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65  pSchema;.    pNe
b270: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
b280: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b290: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b2a0: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
b2b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
b2c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b2d0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b2e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
b2f0: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
b300: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b310: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
b320: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
b330: 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74  tem->fg = pOldIt
b340: 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77  em->fg;.    pNew
b350: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
b360: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
b370: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
b380: 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70  >addrFillSub = p
b390: 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  OldItem->addrFil
b3a0: 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  lSub;.    pNewIt
b3b0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
b3c0: 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74  pOldItem->regRet
b3d0: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  urn;.    if( pNe
b3e0: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  wItem->fg.isInde
b3f0: 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70  xedBy ){.      p
b400: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  NewItem->u1.zInd
b410: 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
b420: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b430: 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  dItem->u1.zIndex
b440: 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  edBy);.    }.   
b450: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e   pNewItem->pIBIn
b460: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
b470: 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  pIBIndex;.    if
b480: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
b490: 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
b4a0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70    pNewItem->u1.p
b4b0: 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20  FuncArg = .     
b4c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b4d0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
b4e0: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
b4f0: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  g, flags);.    }
b500: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
b510: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
b520: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
b530: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
b540: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
b550: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
b560: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
b570: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b580: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
b590: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
b5a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
b5b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b5c0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b5d0: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
b5e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
b5f0: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
b600: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
b610: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
b620: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
b630: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
b640: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
b650: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
b660: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
b670: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b680: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
b690: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
b6a0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
b6b0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
b6c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b6d0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b6e0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b6f0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
b700: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
b710: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b720: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
b730: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
b740: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b750: 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  awNN(db, p->nId*
b760: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
b770: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
b780: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b790: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
b7a0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
b7b0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
b7c0: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
b7d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
b7e0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
b7f0: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
b800: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
b810: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
b820: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
b830: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
b840: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
b850: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
b860: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
b870: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
b880: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
b890: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
b8a0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b8b0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b8c0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
b8d0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
b8e0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
b8f0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
b900: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b910: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b920: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
b930: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
b940: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
b950: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
b960: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
b970: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
b980: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
b990: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b9a0: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
b9b0: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
b9c0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
b9d0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
b9e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b9f0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
ba00: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
ba10: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
ba20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
ba30: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
ba40: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
ba50: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66  db, p->pEList, f
ba60: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
ba70: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
ba80: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
ba90: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  Src, flags);.  p
baa0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
bab0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bac0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
bad0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  s);.  pNew->pGro
bae0: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
baf0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
bb00: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
bb10: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
bb20: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
bb30: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
bb40: 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  ng, flags);.  pN
bb50: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
bb60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bb70: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
bb80: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  y, flags);.  pNe
bb90: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
bba0: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
bbb0: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
bbc0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
bbd0: 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b  >pPrior, flags);
bbe0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20  .  if( pPrior ) 
bbf0: 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
bc00: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e  pNew;.  pNew->pN
bc10: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
bc20: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
bc30: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
bc40: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
bc50: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
bc60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bc70: 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  (db, p->pOffset,
bc80: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
bc90: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
bca0: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
bcb0: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
bcc0: 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
bcd0: 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d   & ~SF_UsesEphem
bce0: 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  eral;.  pNew->ad
bcf0: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
bd00: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
bd10: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
bd20: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
bd30: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
bd40: 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  tRow;.  pNew->pW
bd50: 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62  ith = withDup(db
bd60: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73  , p->pWith);.  s
bd70: 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
bd80: 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65  ame(pNew, p->zSe
bd90: 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  lName);.  return
bda0: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
bdb0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
bdc0: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
bdd0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
bde0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
bdf0: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
be00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
be10: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
be20: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
be30: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
be40: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
be50: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
be60: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
be70: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
be80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
be90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
bea0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
beb0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
bec0: 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20   entire list is 
bed0: 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c  freed and.** NUL
bee0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  L is returned.  
bef0: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72  If non-NULL is r
bf00: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74  eturned, then it
bf10: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
bf20: 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65  * that the new e
bf30: 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73  ntry was success
bf40: 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a  fully appended..
bf50: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
bf60: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
bf70: 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nd(.  Parse *pPa
bf80: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
bf90: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
bfa0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
bfb0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
bfc0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
bfd0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
bfe0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
bff0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
c000: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
c010: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
c020: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
c030: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
c040: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c050: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
c060: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
c070: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
c080: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
c090: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c0a0: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
c0b0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
c0c0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
c0d0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
c0e0: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
c0f0: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61   0;.    pList->a
c100: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c110: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
c120: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
c130: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
c140: 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  >a==0 ) goto no_
c150: 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  mem;.  }else if(
c160: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
c170: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
c180: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))==0 ){.    str
c190: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
c1a0: 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74  m *a;.    assert
c1b0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
c1c0: 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   );.    a = sqli
c1d0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
c1e0: 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74   pList->a, pList
c1f0: 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66  ->nExpr*2*sizeof
c200: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
c210: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
c220: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
c230: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
c240: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
c250: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
c260: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20  a!=0 );.  if( 1 
c270: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
c280: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
c290: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
c2a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
c2b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
c2c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
c2d0: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
c2e0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
c2f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
c300: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
c310: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
c320: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
c330: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
c340: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
c350: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
c360: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
c370: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
c380: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
c390: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  n 0;.}../*.** pC
c3a0: 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78 70 72  olumns and pExpr
c3b0: 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72 20 61   form a vector a
c3c0: 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63 68 20  ssignment which 
c3d0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 53  is part of the S
c3e0: 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20  ET.** clause of 
c3f0: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
c400: 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  ent.  Like this:
c410: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28 61  .**.**        (a
c420: 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c 65  ,b,c) = (expr1,e
c430: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f  xpr2,expr3).** O
c440: 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20  r:    (a,b,c) = 
c450: 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52  (SELECT x,y,z FR
c460: 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46  OM ....).**.** F
c470: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  or each term of 
c480: 74 68 65 20 76 65 63 74 6f 72 20 61 73 73 69 67  the vector assig
c490: 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65  nment, append ne
c4a0: 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  w entries to the
c4b0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
c4c0: 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e 20 74  ist pList.  In t
c4d0: 68 65 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  he case of a sub
c4e0: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 4c 48 53  query on the LHS
c4f0: 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53  , append.** TK_S
c500: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70  ELECT_COLUMN exp
c510: 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70  ressions..*/.Exp
c520: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
c530: 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74  prListAppendVect
c540: 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  or(.  Parse *pPa
c550: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
c560: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c570: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c580: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
c590: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
c5a0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
c5b0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73   NULL */.  IdLis
c5c0: 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20  t *pColumns,    
c5d0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
c5e0: 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74 68 65  es of LHS of the
c5f0: 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20   assignment */. 
c600: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
c610: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f          /* Vecto
c620: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  r expression to 
c630: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
c640: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
c650: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c660: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
c670: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt n;.  int i;. 
c680: 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 4c   int iFirst = pL
c690: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
c6a0: 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f  pr : 0;.  /* pCo
c6b0: 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62  lumns can only b
c6c0: 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e  e NULL due to an
c6d0: 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20   OOM but an OOM 
c6e0: 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20 20  will cause an.  
c6f0: 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20 74 6f  ** exit prior to
c700: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
c710: 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20  ing invoked */. 
c720: 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f 6c 75   if( NEVER(pColu
c730: 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76  mns==0) ) goto v
c740: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
c750: 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  or;.  if( pExpr=
c760: 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72  =0 ) goto vector
c770: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
c780: 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   n = sqlite3Expr
c790: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
c7a0: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  );.  if( pColumn
c7b0: 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20 20 20  s->nId!=n ){.   
c7c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c7d0: 28 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c  (pParse, "%d col
c7e0: 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64  umns assigned %d
c7f0: 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20   values",.      
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
c810: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b  olumns->nId, n);
c820: 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72  .    goto vector
c830: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
c840: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
c850: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  n; i++){.    Exp
c860: 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73 71  r *pSubExpr = sq
c870: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
c880: 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c 20  orField(pParse, 
c890: 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20 70  pExpr, i);.    p
c8a0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
c8b0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
c8c0: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75 62  rse, pList, pSub
c8d0: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
c8e0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73  List ){.      as
c8f0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
c900: 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20 29  pr==iFirst+i+1 )
c910: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ;.      pList->a
c920: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
c930: 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e  .zName = pColumn
c940: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  s->a[i].zName;. 
c950: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61       pColumns->a
c960: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [i].zName = 0;. 
c970: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
c980: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
c990: 45 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ECT ){.    if( p
c9a0: 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 61  List && pList->a
c9b0: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 20 29  [iFirst].pExpr )
c9c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c9d0: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
c9e0: 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  .pExpr->op==TK_S
c9f0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  ELECT_COLUMN );.
ca00: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
ca10: 46 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e 70 52  First].pExpr->pR
ca20: 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  ight = pExpr;.  
ca30: 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20      pExpr = 0;. 
ca40: 20 20 20 7d 0a 20 20 7d 0a 0a 76 65 63 74 6f 72     }.  }..vector
ca50: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20  _append_error:. 
ca60: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
ca70: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
ca80: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
ca90: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e  lete(db, pColumn
caa0: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  s);.  return pLi
cab0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  st;.}../*.** Set
cac0: 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
cad0: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65  for the last ele
cae0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65  ment on the give
caf0: 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76  n ExprList..*/.v
cb00: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
cb10: 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28  istSetSortOrder(
cb20: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
cb30: 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20   iSortOrder){.  
cb40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
cb50: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  n;.  assert( SQL
cb60: 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44  ITE_SO_UNDEFINED
cb70: 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  <0 && SQLITE_SO_
cb80: 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45  ASC>=0 && SQLITE
cb90: 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20  _SO_DESC>0 );.  
cba0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72  assert( p->nExpr
cbb0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72  >0 );.  if( iSor
cbc0: 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20  tOrder<0 ){.    
cbd0: 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e  assert( p->a[p->
cbe0: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
cbf0: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
cc00: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  C );.    return;
cc10: 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e  .  }.  p->a[p->n
cc20: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
cc30: 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64  r = (u8)iSortOrd
cc40: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
cc50: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
cc60: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
cc70: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
cc80: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
cc90: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
cca0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
ccb0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
ccc0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
ccd0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
cce0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
ccf0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
cd00: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
cd10: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
cd20: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
cd30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
cd40: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
cd50: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
cd60: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
cd70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
cd80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
cd90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
cda0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
cdb0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
cdc0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
cdd0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
cde0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
cdf0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
ce00: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
ce10: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
ce20: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
ce30: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
ce40: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
ce50: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
ce60: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
ce70: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
ce80: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
ce90: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
cea0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ceb0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
cec0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
ced0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
cee0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
cef0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
cf00: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
cf10: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
cf20: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
cf30: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
cf40: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
cf50: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
cf60: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
cf70: 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ote ) sqlite3Deq
cf80: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
cf90: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
cfa0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
cfb0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
cfc0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
cfd0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
cfe0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
cff0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
d000: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
d010: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
d020: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
d030: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
d040: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
d050: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
d060: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
d070: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
d080: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d090: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
d0a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d0b0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
d0c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d0d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d0e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d0f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d100: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
d110: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
d120: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
d130: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
d140: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
d150: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
d160: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
d170: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d180: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
d190: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
d1a0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
d1b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d1c0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d1d0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
d1e0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
d1f0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
d200: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
d210: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
d220: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
d230: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
d240: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
d250: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
d260: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d270: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
d280: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
d290: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
d2a0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
d2b0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
d2f0: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
d300: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
d310: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
d320: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
d330: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
d340: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
d350: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
d360: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
d370: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
d380: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d390: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
d3a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
d3b0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d3c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
d3d0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
d3e0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
d3f0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
d400: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
d410: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
d420: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
d430: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
d440: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
d450: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
d460: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
d470: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
d480: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
d490: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d4a0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
d4b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
d4c0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
d4d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
d4e0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
d4f0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
d500: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
d510: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
d520: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
d530: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
d540: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
d550: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
d560: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d570: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
d580: 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ->a!=0 || pList-
d590: 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66  >nExpr==0 );.  f
d5a0: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
d5b0: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
d5c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
d5d0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
d5e0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
d5f0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
d600: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d610: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
d620: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
d630: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
d640: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  ->zSpan);.  }.  
d650: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d660: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
d670: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d680: 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20   pList);.}.void 
d690: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d6a0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
d6b0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
d6c0: 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  st){.  if( pList
d6d0: 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74   ) exprListDelet
d6e0: 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
d6f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d700: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
d710: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
d720: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
d730: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
d740: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
d750: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
d760: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
d770: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
d780: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66   u32 m = 0;.  if
d790: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
d7a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
d7b0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d7c0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
d7d0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
d7e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61 73 73  Expr;.       ass
d7f0: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
d800: 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 45 78  .       m |= pEx
d810: 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  pr->flags;.    }
d820: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
d830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
d840: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
d850: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73  ker callbacks us
d860: 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72  ed to check expr
d870: 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65  essions to.** se
d880: 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22 63  e if they are "c
d890: 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d  onstant" for som
d8a0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
d8b0: 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a  constant.  The.*
d8c0: 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  * Walker.eCode v
d8d0: 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20  alue determines 
d8e0: 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e  the type of "con
d8f0: 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f  stant" we are lo
d900: 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a  oking.** for..**
d910: 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61  .** These callba
d920: 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ck routines are 
d930: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
d940: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  t the following:
d950: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
d960: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
d970: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ()              
d980: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
d990: 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c  de==1.**     sql
d9a0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
d9b0: 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20  ntNotJoin()     
d9c0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
d9d0: 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73  Code==2.**     s
d9e0: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
d9f0: 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  eConstant()     
da00: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
da10: 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20  >eCode==3.**    
da20: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
da30: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
da40: 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ()        pWalke
da50: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
da60: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61  .**.** In all ca
da70: 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ses, the callbac
da80: 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43  ks set Walker.eC
da90: 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20  ode=0 and abort 
daa0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
dab0: 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f  n.** is found to
dac0: 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61   not be a consta
dad0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  nt..**.** The sq
dae0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
daf0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
db00: 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c  is used for eval
db10: 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f  uating expressio
db20: 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  ns.** in a CREAT
db30: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
db40: 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65  t.  The Walker.e
db50: 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35 20  Code value is 5 
db60: 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20  when parsing.** 
db70: 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  an existing sche
db80: 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72  ma and 4 when pr
db90: 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73  ocessing a new s
dba0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75  tatement.  A bou
dbb0: 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  nd.** parameter 
dbc0: 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20  raises an error 
dbd0: 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  for new statemen
dbe0: 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e  ts, but is silen
dbf0: 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a  tly converted.**
dc00: 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69   to NULL for exi
dc10: 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20  sting schemas.  
dc20: 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69  This allows sqli
dc30: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
dc40: 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69   that .** contai
dc50: 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  n a bound parame
dc60: 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65 79  ter because they
dc70: 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64 20   were generated 
dc80: 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
dc90: 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74  s.** of SQLite t
dca0: 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20 6e  o be parsed by n
dcb0: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
dcc0: 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20   SQLite without 
dcd0: 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c  raising a.** mal
dce0: 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72  formed schema er
dcf0: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
dd00: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
dd10: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
dd20: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
dd30: 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57  pr){..  /* If pW
dd40: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20  alker->eCode is 
dd50: 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  2 then any term 
dd60: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
dd70: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
dd80: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
dd90: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
dda0: 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69  f a left join di
ddb0: 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65  squalifies the e
ddc0: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66  xpression.  ** f
ddd0: 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64  rom being consid
dde0: 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a  ered constant. *
ddf0: 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  /.  if( pWalker-
de00: 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70  >eCode==2 && Exp
de10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
de20: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
de30: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
de40: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
de50: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
de60: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
de70: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
de80: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
de90: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
dea0: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
deb0: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
dec0: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
ded0: 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61  * and either pWa
dee0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f  lker->eCode==4 o
def0: 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74  r 5 or the funct
df00: 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20  ion has the.    
df10: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  ** SQLITE_FUNC_C
df20: 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20  ONST flag. */.  
df30: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
df40: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  ON:.      if( pW
df50: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20  alker->eCode>=4 
df60: 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
df70: 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73  ty(pExpr,EP_Cons
df80: 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  tFunc) ){.      
df90: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
dfa0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
dfb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c  se{.        pWal
dfc0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
dfd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
dfe0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
dff0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  }.    case TK_ID
e000: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
e010: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
e020: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
e030: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
e040: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65  COLUMN:.      te
e050: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
e060: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
e070: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e080: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
e090: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e0a0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e0b0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
e0c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e0d0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e0e0: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
e0f0: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
e100: 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78  >eCode==3 && pEx
e110: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
e120: 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20  ker->u.iCur ){. 
e130: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e140: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
e150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e160: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e170: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
e180: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e190: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
e1a0: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
e1b0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
e1c0: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
e1d0: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
e1e0: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
e1f0: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
e200: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
e210: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
e220: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
e230: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
e240: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
e250: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
e260: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
e270: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e280: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
e290: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
e2a0: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
e2b0: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
e2c0: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
e2d0: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
e2e0: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
e2f0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
e300: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
e310: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
e320: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
e330: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
e340: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
e350: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e360: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e370: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e380: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
e390: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
e3a0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
e3b0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e3c0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
e3d0: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
e3e0: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
e3f0: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
e400: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e410: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
e420: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
e430: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
e440: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
e450: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
e460: 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61  tinue;.  }.}.sta
e470: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f  tic int selectNo
e480: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
e490: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
e4a0: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
e4b0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e4c0: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
e4d0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
e4e0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
e4f0: 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20  Abort;.}.static 
e500: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
e510: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
e520: 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29  tFlag, int iCur)
e530: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
e540: 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
e550: 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
e560: 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  ode = initFlag;.
e570: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
e580: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
e590: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
e5a0: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
e5b0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e5c0: 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  nt;.  w.u.iCur =
e5d0: 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
e5e0: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
e5f0: 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
e600: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
e610: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e620: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
e630: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
e640: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
e650: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
e660: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
e670: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
e680: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
e690: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
e6a0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
e6b0: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
e6c0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
e6d0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
e6e0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
e6f0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
e700: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
e710: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
e720: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
e730: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
e740: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
e750: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
e760: 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
e770: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
e780: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
e790: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
e7a0: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
e7b0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
e7c0: 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  .** that does no
e7d0: 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
e7e0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
e7f0: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
e800: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
e810: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
e820: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
e830: 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72  ion calls or ter
e840: 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e  ms from.** an ON
e850: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
e860: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e870: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
e880: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
e890: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
e8a0: 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
e8b0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
e8c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
e8d0: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
e8e0: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
e8f0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
e900: 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
e910: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
e920: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
e930: 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
e940: 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
e950: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
e960: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
e970: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
e980: 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
e990: 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
e9a0: 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
e9b0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
e9c0: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
e9d0: 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
e9e0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
e9f0: 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
ea00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
ea10: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
ea20: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
ea30: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
ea40: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
ea50: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
ea60: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
ea70: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
ea80: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
ea90: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
eaa0: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
eab0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
eac0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
ead0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
eae0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
eaf0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
eb00: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
eb10: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
eb20: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
eb30: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
eb40: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
eb50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
eb60: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
eb70: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c  unction(Expr *p,
eb80: 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61   u8 isInit){.  a
eb90: 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30  ssert( isInit==0
eba0: 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b   || isInit==1 );
ebb0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
ebc0: 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69  Const(p, 4+isIni
ebd0: 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  t, 0);.}..#ifdef
ebe0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
ebf0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
ec00: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
ec10: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
ec20: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
ec30: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
ec40: 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66  a.** subquery of
ec50: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74   some kind.  Ret
ec60: 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61  urn 0 if there a
ec70: 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73  re no subqueries
ec80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ec90: 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71  ExprContainsSubq
eca0: 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20  uery(Expr *p){. 
ecb0: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
ecc0: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
ecd0: 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65  f(w));.  w.eCode
ece0: 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43   = 1;.  w.xExprC
ecf0: 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
ed00: 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
ed10: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
ed20: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
ed30: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
ed40: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
ed50: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
ed60: 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  eCode==0;.}.#end
ed70: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
ed80: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
ed90: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
eda0: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
edb0: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
edc0: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
edd0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
ede0: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
edf0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
ee00: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
ee10: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
ee20: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
ee30: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
ee40: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
ee50: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
ee60: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
ee70: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
ee80: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
ee90: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
eea0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
eeb0: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
eec0: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
eed0: 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  t rc = 0;..  /* 
eee0: 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
eef0: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c   is an integer l
ef00: 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73  iteral that fits
ef10: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
ef20: 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  bit.  ** integer
ef30: 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e  , then the EP_In
ef40: 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c  tValue flag will
ef50: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
ef60: 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65  en set */.  asse
ef70: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  rt( p->op!=TK_IN
ef80: 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61  TEGER || (p->fla
ef90: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
efa0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
efb0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
efc0: 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  32(p->u.zToken, 
efd0: 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  &rc)==0 );..  if
efe0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
eff0: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
f000: 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
f010: 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
f020: 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
f030: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
f040: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
f050: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f060: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
f070: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
f080: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
f090: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f0a0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
f0b0: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
f0c0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
f0d0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
f0e0: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
f0f0: 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32    assert( v!=(-2
f100: 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a  147483647-1) );.
f110: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
f120: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
f130: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
f140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f150: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
f160: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
f170: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
f180: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
f190: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
f1a0: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
f1b0: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
f1c0: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
f1d0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
f1e0: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
f1f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f200: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
f210: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
f220: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
f230: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
f240: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
f250: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
f260: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
f270: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
f280: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
f290: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
f2a0: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
f2b0: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
f2c0: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
f2d0: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
f2e0: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
f2f0: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
f300: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
f310: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
f320: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
f330: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
f340: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
f350: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
f360: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
f370: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
f380: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
f390: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
f3a0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
f3b0: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
f3c0: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
f3d0: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
f3e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f3f0: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
f400: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
f410: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
f420: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
f430: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
f440: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
f450: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
f460: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
f470: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
f480: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
f490: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
f4a0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
f4b0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
f4c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
f4d0: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
f4e0: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
f4f0: 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
f500: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
f510: 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21  assert( p->pTab!
f520: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
f530: 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
f540: 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
f550: 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
f560: 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e      (p->iColumn>
f570: 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61  =0 && p->pTab->a
f580: 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  Col[p->iColumn].
f590: 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20  notNull==0);.   
f5a0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
f5b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
f5c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
f5d0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
f5e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
f5f0: 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77  constant which w
f600: 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61  ould be.** uncha
f610: 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e  nged by OP_Affin
f620: 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66  ity with the aff
f630: 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74  inity given in t
f640: 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
f650: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ument..**.** Thi
f660: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
f670: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
f680: 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  f the OP_Affinit
f690: 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63  y operation.** c
f6a0: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20  an be omitted.  
f6b0: 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65  When in doubt re
f6c0: 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66  turn FALSE.  A f
f6d0: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a  alse negative.**
f6e0: 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41   is harmless.  A
f6f0: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c   false positive,
f700: 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65   however, can re
f710: 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  sult in the wron
f720: 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a  g.** answer..*/.
f730: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e  int sqlite3ExprN
f740: 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
f750: 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20  ange(const Expr 
f760: 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20  *p, char aff){. 
f770: 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66   u8 op;.  if( af
f780: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  f==SQLITE_AFF_BL
f790: 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  OB ) return 1;. 
f7a0: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
f7b0: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
f7c0: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
f7d0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
f7e0: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
f7f0: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
f800: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
f810: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
f820: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
f830: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  TEGER: {.      r
f840: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
f850: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
f860: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
f870: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
f880: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
f890: 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
f8a0: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
f8b0: 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53  F_REAL || aff==S
f8c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
f8d0: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
f8e0: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
f8f0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
f900: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
f910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f920: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
f930: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
f940: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
f950: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73  LUMN: {.      as
f960: 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e  sert( p->iTable>
f970: 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e  =0 );  /* p cann
f980: 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20  ot be part of a 
f990: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
f9a0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
f9b0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20   p->iColumn<0.  
f9c0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
f9d0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
f9e0: 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
f9f0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b  TE_AFF_NUMERIC);
fa00: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
fa10: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lt: {.      retu
fa20: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
fa30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
fa40: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
fa50: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
fa60: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
fa70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fa80: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
fa90: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
faa0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
fab0: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
fac0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
fad0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fae0: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
faf0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
fb00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fb10: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
fb20: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
fb30: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20   0;.}../*.** pX 
fb40: 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e  is the RHS of an
fb50: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
fb60: 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43 54  f pX is a SELECT
fb70: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74   statement .** t
fb80: 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c  hat can be simpl
fb90: 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65 63  ified to a direc
fba0: 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20  t table access, 
fbb0: 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61  then return.** a
fbc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
fbd0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fbe0: 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20  .  If pX is not 
fbf0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fc00: 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65  nt,.** or if the
fc10: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fc20: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61  t needs to be ma
fc30: 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20  nifested into a 
fc40: 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62  transient.** tab
fc50: 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  le, then return 
fc60: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  NULL..*/.#ifndef
fc70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
fc80: 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c  QUERY.static Sel
fc90: 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65  ect *isCandidate
fca0: 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70  ForInOpt(Expr *p
fcb0: 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  X){.  Select *p;
fcc0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
fcd0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
fce0: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
fcf0: 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Tab;.  int i;.  
fd00: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
fd10: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
fd20: 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20  elect) ) return 
fd30: 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62  0;  /* Not a sub
fd40: 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45  query */.  if( E
fd50: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fd60: 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  X, EP_VarSelect)
fd70: 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f    ) return 0;  /
fd80: 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62  * Correlated sub
fd90: 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78  q */.  p = pX->x
fda0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  .pSelect;.  if( 
fdb0: 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  p->pPrior ) retu
fdc0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
fdd0: 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70     /* Not a comp
fde0: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
fdf0: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
fe00: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
fe10: 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
fe20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
fe30: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
fe40: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
fe50: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
fe60: 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65  stinct );.    te
fe70: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
fe80: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
fe90: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
fea0: 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
feb0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
fec0: 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54  ; /* No DISTINCT
fed0: 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20   keyword and no 
fee0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
fef0: 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ons */.  }.  ass
ff00: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
ff10: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
ff20: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52      /* Has no GR
ff30: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
ff40: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
ff50: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
ff60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
ff70: 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   no LIMIT clause
ff80: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ff90: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ffb0: 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e  No LIMIT means n
ffc0: 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66  o OFFSET */.  if
ffd0: 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  ( p->pWhere ) re
ffe0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
fff0: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57       /* Has no W
10000 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
10010 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
10020 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
10030 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63  =0 );.  if( pSrc
10040 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
10050 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
10060 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  * Single term in
10070 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
10080 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
10090 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
100a0 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
100b0 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65   is not a subque
100c0 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  ry or view */.  
100d0 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
100e0 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ].pTab;.  assert
100f0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
10100 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65  ssert( pTab->pSe
10110 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  lect==0 );      
10120 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
10130 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
10140 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
10150 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
10160 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
10170 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
10180 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
10190 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
101a0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73  p->pEList;.  ass
101b0 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
101c0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  ;..  /* All SELE
101d0 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
101e0 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
101f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
10200 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
10210 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
10220 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
10230 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
10240 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
10250 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
10260 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
10270 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
10280 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
10290 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
102a0 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
102b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
102c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
102d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
102e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
102f0 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  n OP_Once instru
10300 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61  ction and alloca
10310 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 73  te space for its
10320 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68   flag. Return th
10330 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  e .** address of
10340 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
10350 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
10360 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72  ite3CodeOnce(Par
10370 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
10380 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
10390 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
103a0 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
103b0 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
103c0 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  oded */.  return
103d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
103e0 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70  p1(v, OP_Once, p
103f0 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b  Parse->nOnce++);
10400 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10410 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10420 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10430 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
10440 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
10450 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
10460 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
10470 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
10480 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
10490 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
104a0 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
104b0 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
104c0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
104d0 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
104e0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
104f0 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
10500 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
10510 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
10520 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
10530 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
10540 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
10550 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
10560 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
10570 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
10580 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
10590 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
105a0 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
105b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
105c0 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
105d0 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
105e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
105f0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
10600 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
10610 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
10620 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10630 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
10640 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
10650 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10660 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
10670 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
10680 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
10690 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
106a0 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
106b0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
106c0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
106d0 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
106e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
106f0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
10700 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
10710 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
10720 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
10730 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
10740 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
10750 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
10760 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
10770 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
10780 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
10790 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
107a0 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
107b0 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
107c0 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
107d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
107e0 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
107f0 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
10800 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
10810 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
10820 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
10830 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
10840 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
10850 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
10860 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
10870 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10880 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
10890 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
108a0 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
108b0 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
108c0 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
108d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
108e0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
108f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
10900 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
10910 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
10920 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
10930 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
10940 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
10950 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
10960 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
10970 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
10980 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
10990 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
109a0 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
109b0 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
109c0 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
109d0 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
109e0 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
109f0 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
10a00 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
10a10 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
10a20 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
10a30 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
10a40 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
10a50 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
10a60 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
10a70 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
10a80 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
10a90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
10aa0 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
10ab0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
10ac0 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
10ad0 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
10ae0 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
10af0 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
10b00 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
10b10 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
10b20 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
10b30 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
10b40 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
10b50 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10b60 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
10b70 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
10b80 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
10b90 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
10ba0 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
10bb0 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
10bc0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
10bd0 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
10be0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10bf0 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
10c00 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
10c30 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
10c40 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
10c50 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
10c60 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
10c70 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
10c80 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ca0 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
10cb0 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
10cc0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
10cd0 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
10ce0 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
10cf0 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
10d00 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
10d10 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
10d20 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
10d30 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
10d40 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
10d50 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
10d60 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
10d70 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
10d80 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
10d90 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
10da0 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
10db0 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
10dc0 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
10dd0 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
10de0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
10df0 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
10e00 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
10e10 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
10e20 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
10e30 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
10e40 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
10e50 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
10e60 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
10e70 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c 79   contain exactly
10e80 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73   one of the bits
10e90 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
10ea0 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e  BERSHIP or IN_IN
10eb0 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69 6e  DEX_LOOP.  If in
10ec0 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a  Flags contains.*
10ed0 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  * IN_INDEX_MEMBE
10ee0 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20  RSHIP, then the 
10ef0 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20  generated table 
10f00 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
10f10 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62 65   a.** fast membe
10f20 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65  rship test.  Whe
10f30 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c  n the IN_INDEX_L
10f40 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20  OOP bit is set, 
10f50 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78 20  the.** IN index 
10f60 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
10f70 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61  loop over all va
10f80 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20  lues of the RHS 
10f90 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70 65  of the.** IN ope
10fa0 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  rator..**.** Whe
10fb0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  n IN_INDEX_LOOP 
10fc0 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
10fd0 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
10fe0 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a  used to iterate.
10ff0 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ** through the s
11000 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e  et members) then
11010 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74   the b-tree must
11020 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70   not contain dup
11030 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65  licates..** An e
11040 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
11050 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65  ust be used unle
11060 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ss the selected 
11070 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72  columns are guar
11080 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
11090 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20  unique - either 
110a0 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
110b0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
110c0 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a   KEY or due to.*
110d0 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  * a UNIQUE const
110e0 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a  raint or index..
110f0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
11100 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
11110 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
11120 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
11130 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
11140 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
11150 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
11160 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
11170 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
11180 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e  unless <columns>
11190 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54   is a single INT
111a0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
111b0 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a   column or an .*
111c0 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66  * index can be f
111d0 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70  ound with the sp
111e0 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73  ecified <columns
111f0 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f  > as its left-mo
11200 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
11210 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
11220 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d  K and IN_INDEX_M
11230 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f  EMBERSHIP are bo
11240 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66  th set and.** if
11250 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
11260 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
11270 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
11280 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73  query) then this
11290 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  .** routine migh
112a0 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72  t decide that cr
112b0 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
112c0 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d  ral b-tree for m
112d0 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73  embership.** tes
112e0 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65  ting is too expe
112f0 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e  nsive and return
11300 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20   IN_INDEX_NOOP. 
11310 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
11320 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
11330 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70  utine should imp
11340 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70  lement the IN op
11350 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73  erator using a s
11360 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71  equence.** of Eq
11370 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f   or Ne compariso
11380 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  n operations..**
11390 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
113a0 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
113b0 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
113c0 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
113d0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
113e0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e  might need to kn
113f0 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
11400 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f  t the RHS side o
11410 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
11420 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  r.** contains a 
11430 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48  NULL.  If prRhsH
11440 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20  asNull is not a 
11450 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
11460 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73   .** if there is
11470 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74   any chance that
11480 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74   the (...) might
11490 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
114a0 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
114b0 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
114c0 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
114d0 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
114e0 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
114f0 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61  n.** to *prRhsHa
11500 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20  sNull. If there 
11510 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
11520 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74  t the (...) cont
11530 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76  ains a.** NULL v
11540 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68  alue, then *prRh
11550 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74  sHasNull is left
11560 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
11570 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
11580 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
11590 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
115a0 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61  ored in *prRhsHa
115b0 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74  sNull, then.** t
115c0 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74  he value in that
115d0 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62   register will b
115e0 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d  e NULL if the b-
115f0 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  tree contains on
11600 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c  e or more.** NUL
11610 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74  L values, and it
11620 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f   will be some no
11630 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
11640 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
11650 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76  ins no.** NULL v
11660 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alues..**.** If 
11670 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65  the aiMap parame
11680 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
11690 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74   it must point t
116a0 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61  o an array conta
116b0 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65  ining.** one ele
116c0 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f  ment for each co
116d0 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
116e0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
116f0 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53  ement on the RHS
11700 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  .** of the IN(..
11710 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65  .) operator. The
11720 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74   i'th entry of t
11730 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  he array is popu
11740 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a  lated with the.*
11750 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  * offset of the 
11760 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
11770 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27  t matches the i'
11780 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  th column return
11790 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c  ed by the.** SEL
117a0 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ECT. For example
117b0 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  , if the express
117c0 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64  ion and selected
117d0 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a   index are:.**.*
117e0 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28  *   (?,?,?) IN (
117f0 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
11800 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45  ROM t1).**   CRE
11810 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
11820 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a  t1(b, c, a);.**.
11830 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20  ** then aiMap[] 
11840 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11850 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a  h {2, 0, 1}..*/.
11860 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11870 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
11880 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
11890 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
118a0 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
118b0 58 2c 20 0a 20 20 75 33 32 20 69 6e 46 6c 61 67  X, .  u32 inFlag
118c0 73 2c 20 0a 20 20 69 6e 74 20 2a 70 72 52 68 73  s, .  int *prRhs
118d0 48 61 73 4e 75 6c 6c 2c 0a 20 20 69 6e 74 20 2a  HasNull,.  int *
118e0 61 69 4d 61 70 0a 29 7b 0a 20 20 53 65 6c 65 63  aiMap.){.  Selec
118f0 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
11920 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
11930 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
11940 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
11970 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
11980 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
11990 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
119a0 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
119b0 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
119c0 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
119d0 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20  t mustBeUnique; 
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52      /* True if R
11a00 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
11a10 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
11a20 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
11a30 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
11a40 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
11a50 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
11a60 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
11a70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73  ==TK_IN );.  mus
11a80 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46  tBeUnique = (inF
11a90 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
11aa0 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  LOOP)!=0;..  /* 
11ab0 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
11ac0 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  is IN(...) opera
11ad0 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c  tor is a SELECT,
11ae0 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65   and if it matte
11af0 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  rs .  ** whether
11b00 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45   or not the SELE
11b10 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  CT result contai
11b20 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ns NULL values, 
11b30 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20  check whether.  
11b40 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69  ** or not NULL i
11b50 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
11b60 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20  ble (it may not 
11b70 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  be, for example,
11b80 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f   due .  ** to NO
11b90 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
11ba0 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
11bb0 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61  ). If no NULL va
11bc0 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  lues are possibl
11bd0 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68  e,.  ** set prRh
11be0 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65  sHasNull to 0 be
11bf0 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
11c00 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73    */.  if( prRhs
11c10 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e  HasNull && (pX->
11c20 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
11c30 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  lect) ){.    int
11c40 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   i;.    ExprList
11c50 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78   *pEList = pX->x
11c60 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
11c70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11c80 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
11c90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
11ca0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
11cb0 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69  Null(pEList->a[i
11cc0 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b  ].pExpr) ) break
11cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11ce0 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  i==pEList->nExpr
11cf0 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48   ){.      prRhsH
11d00 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  asNull = 0;.    
11d10 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
11d20 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
11d30 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
11d40 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
11d50 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
11d60 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
11d70 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
11d80 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
11d90 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
11da0 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f  meral table.  */
11db0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11dc0 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69  Err==0 && (p = i
11dd0 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
11de0 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20  pt(pX))!=0 ){.  
11df0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11e00 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
11e10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
11e20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11e30 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
11e40 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e60 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
11e70 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ea0 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
11eb0 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78  r pTab */.    Ex
11ec0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
11ed0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
11ee0 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69  int nExpr = pELi
11ef0 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
11f00 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11f10 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
11f20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
11f30 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11f40 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11f50 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11f60 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  t->a[0].pExpr!=0
11f70 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f   ); /* Because o
11f80 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11f90 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11fa0 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
11fb0 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
11fc0 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
11fd0 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11fe0 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11ff0 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
12000 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20  a[0].pTab;..    
12010 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
12020 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
12030 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
12040 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
12050 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12060 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
12070 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
12080 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
12090 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
120a0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
120b0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
120c0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
120d0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
120e0 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Name);..    /* T
120f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12100 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
12110 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
12120 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
12130 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
12140 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
12150 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
12160 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12170 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
12180 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
12190 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
121a0 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
121b0 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
121c0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
121d0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
121e0 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
121f0 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
12200 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
12210 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
12220 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
12230 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
12240 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12250 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71  ge(v);..      sq
12260 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
12270 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
12280 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
12290 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
122a0 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
122b0 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
122c0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
122d0 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
122e0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
122f0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
12320 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
12330 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
12340 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
12350 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
12360 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
12370 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
12380 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
12390 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
123a0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
123b0 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
123c0 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
123d0 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20  umn in table.   
123e0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53     ** on the RHS
123f0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12400 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c  tor.  If it not,
12410 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12420 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
12430 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66  use any index of
12440 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20   the RHS table. 
12450 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
12460 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66  0; i<nExpr && af
12470 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b  finity_ok; i++){
12480 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
12490 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
124a0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
124b0 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
124c0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
124d0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
124e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
124f0 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
12500 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
12510 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
12520 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52  pTab,iCol); /* R
12530 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  HS table */.    
12540 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20      char cmpaff 
12550 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
12560 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69  Affinity(pLhs, i
12570 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
12580 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
12590 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
125a0 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  B );.        tes
125b0 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
125c0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
125d0 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
125e0 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20  ( cmpaff ){.    
125f0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
12600 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
12610 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12620 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
12630 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
12640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
12650 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
12660 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75  nity() only retu
12670 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20  rns TEXT if one 
12680 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
12690 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
126a0 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79   has no affinity
126b0 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73   and the other s
126c0 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65  ide is TEXT.  He
126d0 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nce,.           
126e0 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   ** the only way
126f0 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62   for cmpaff to b
12700 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64  e TEXT is for id
12710 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a  xaff to be TEXT.
12720 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
12730 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20  nd for the term 
12740 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
12750 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20  e IN to have no 
12760 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
12770 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
12780 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f   idxaff==SQLITE_
12790 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
127a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
127b0 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
127c0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66  :.            af
127d0 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
127e0 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
127f0 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20  nity(idxaff);.  
12800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12810 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
12820 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
12830 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
12840 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
12850 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20  ndex is to.     
12860 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
12870 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
12880 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
12890 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
128a0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
128b0 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
128c0 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20 20  quence.  */..   
128d0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
128e0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
128f0 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66  & eType==0 && af
12900 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d  finity_ok; pIdx=
12910 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
12920 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12930 6e 4b 65 79 43 6f 6c 3c 6e 45 78 70 72 20 29 20  nKeyCol<nExpr ) 
12940 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12950 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71    if( mustBeUniq
12960 75 65 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65  ue && (pIdx->nKe
12970 79 43 6f 6c 21 3d 6e 45 78 70 72 20 7c 7c 20 21  yCol!=nExpr || !
12980 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
12990 64 78 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dx)) ){.        
129a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
129b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
129c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
129d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
129e0 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
129f0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
12a00 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66  Subexpr(pX->pLef
12a10 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
12a20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45   Expr *pRhs = pE
12a30 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12a40 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  ;.          Coll
12a50 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69  Seq *pReq = sqli
12a60 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
12a70 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
12a80 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
12a90 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20         int j;.. 
12aa0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
12ab0 71 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  q==0 ) break;.. 
12ac0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
12ad0 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  ; j<nExpr; j++){
12ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
12af0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
12b00 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d  j]!=pRhs->iColum
12b10 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
12b20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
12b30 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  ( pIdx->azColl[j
12b40 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ] );.           
12b50 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
12b60 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c  Cmp(pReq->zName,
12b70 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
12b80 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
12b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
12ba0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
12bb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
12bc0 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a  =nExpr ) break;.
12bd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69            if( ai
12be0 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d  Map ) aiMap[i] =
12bf0 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   j;.        }.. 
12c00 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 45         if( i==nE
12c10 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
12c20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
12c30 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
12c40 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
12c50 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
12c60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c70 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
12c80 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
12c90 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
12ca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12cb0 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
12cc0 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
12cd0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
12ce0 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
12cf0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
12d00 20 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f       assert( IN_
12d10 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
12d20 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44   == IN_INDEX_IND
12d30 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20  EX_ASC+1 );.    
12d40 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
12d50 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
12d60 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   + pIdx->aSortOr
12d70 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20  der[0];..       
12d80 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e     if( prRhsHasN
12d90 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ull ){.         
12da0 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
12db0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12dc0 6d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  m;.#ifdef SQLITE
12dd0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
12de0 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
12df0 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20       i64 mask = 
12e00 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20  (1<<nExpr)-1;.  
12e10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12e20 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
12e30 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
12e40 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
12e50 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20      iTab, 0, 0, 
12e60 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49  (u8*)&mask, P4_I
12e70 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NT64);.#endif.  
12e80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45            if( nE
12e90 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr==1 ){.      
12ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
12eb0 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
12ec0 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73   iTab, *prRhsHas
12ed0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
12ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
12ef0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12f00 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12f10 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
12f20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12f30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
12f40 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e  o preexisting in
12f50 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65  dex is available
12f60 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75   for the IN clau
12f70 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49  se.  ** and IN_I
12f80 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20  NDEX_NOOP is an 
12f90 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20  allowed reply.  
12fa0 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f  ** and the RHS o
12fb0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
12fc0 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74  r is a list, not
12fd0 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a   a subquery.  **
12fe0 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20   and the RHS is 
12ff0 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20  not constant or 
13000 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72  has two or fewer
13010 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65   terms,.  ** the
13020 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74  n it is not wort
13030 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  h creating an ep
13040 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
13050 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74   evaluate.  ** t
13060 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73  he IN operator s
13070 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  o return IN_INDE
13080 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69  X_NOOP..  */.  i
13090 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26  f( eType==0.   &
130a0 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  & (inFlags & IN_
130b0 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20  INDEX_NOOP_OK). 
130c0 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
130d0 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
130e0 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21  Select).   && (!
130f0 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
13100 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58  nstant(pX) || pX
13110 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
13120 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54  <=2).  ){.    eT
13130 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e  ype = IN_INDEX_N
13140 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
13150 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
13160 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  /* Could not fin
13170 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
13180 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
13190 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
131a0 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
131b0 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
131c0 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
131d0 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
131e0 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
131f0 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75      u32 savedNQu
13200 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
13210 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
13220 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
13230 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70  ll = 0;.    eTyp
13240 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  e = IN_INDEX_EPH
13250 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67  ;.    if( inFlag
13260 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  s & IN_INDEX_LOO
13270 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  P ){.      pPars
13280 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
13290 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  0;.      if( pX-
132a0 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
132b0 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  0 && !ExprHasPro
132c0 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
132d0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
132e0 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
132f0 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  DEX_ROWID;.     
13300 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13310 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
13320 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73  .      *prRhsHas
13330 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e  Null = rMayHaveN
13340 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
13350 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nMem;.    }.    
13360 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
13370 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
13380 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
13390 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
133a0 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73  OWID);.    pPars
133b0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
133c0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
133d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58  .  }else{.    pX
133e0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
133f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61  .  }..  if( aiMa
13400 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  p && eType!=IN_I
13410 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26  NDEX_INDEX_ASC &
13420 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
13430 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
13440 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
13450 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70    n = sqlite3Exp
13460 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e  rVectorSize(pX->
13470 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28  pLeft);.    for(
13480 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61  i=0; i<n; i++) a
13490 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d  iMap[i] = i;.  }
134a0 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
134b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
134c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
134d0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72  UBQUERY./*.** Ar
134e0 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20  gument pExpr is 
134f0 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28  an (?, ?...) IN(
13500 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e  ...) expression.
13510 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
13520 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
13530 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74   returns a nul-t
13540 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
13550 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20   containing .** 
13560 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 74  the affinities t
13570 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 61  o be used for ea
13580 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
13590 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a   comparison..**.
135a0 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
135b0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
135c0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73  he caller to ens
135d0 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 74  ure that the ret
135e0 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  urned.** string 
135f0 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  is eventually fr
13600 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  eed using sqlite
13610 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  3DbFree()..*/.st
13620 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72 49  atic char *exprI
13630 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  NAffinity(Parse 
13640 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
13650 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  Expr){.  Expr *p
13660 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
13670 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20  eft;.  int nVal 
13680 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
13690 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
136a0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
136b0 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  t = (pExpr->flag
136c0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
136d0 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  ) ? pExpr->x.pSe
136e0 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72  lect : 0;.  char
136f0 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72   *zRet;..  asser
13700 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
13710 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20  _IN );.  zRet = 
13720 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
13730 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
13740 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a  nVal+1);.  if( z
13750 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
13760 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
13770 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
13780 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71     Expr *pA = sq
13790 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
137a0 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
137b0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20  );.      char a 
137c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
137d0 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20  inity(pA);.     
137e0 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
137f0 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
13800 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
13810 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74  Affinity(pSelect
13820 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
13830 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20  Expr, a);.      
13840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
13850 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20  Ret[i] = a;.    
13860 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52    }.    }.    zR
13870 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b  et[nVal] = '\0';
13880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
13890 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  et;.}.#endif..#i
138a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
138b0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
138c0 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20   Load the Parse 
138d0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
138e0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
138f0 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ent with an erro
13900 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66  r .** message of
13910 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
13920 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
13930 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
13940 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a   - expected M".*
13950 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
13960 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
13970 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
13980 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20  nt nActual, int 
13990 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73  nExpect){.  cons
139a0 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22  t char *zFmt = "
139b0 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
139c0 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20  ns %d columns - 
139d0 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20  expected %d";.  
139e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
139f0 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41  pParse, zFmt, nA
13a00 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b  ctual, nExpect);
13a10 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
13a20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
13a30 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
13a40 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
13a50 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
13a60 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
13a70 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
13a80 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
13a90 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
13aa0 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
13ab0 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
13ac0 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
13ad0 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
13ae0 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
13af0 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
13b00 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
13b10 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
13b20 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
13b30 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
13b40 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
13b50 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
13b60 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
13b70 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
13b80 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
13b90 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
13ba0 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
13bb0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
13bc0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
13bd0 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
13be0 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
13bf0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
13c00 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
13c10 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
13c20 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
13c30 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
13c40 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
13c50 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
13c60 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
13c70 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
13c80 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
13c90 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
13ca0 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
13cb0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
13cc0 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
13cd0 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
13ce0 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
13cf0 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
13d00 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
13d10 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
13d20 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
13d30 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
13d40 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
13d50 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
13d60 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13d70 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
13d80 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
13d90 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
13da0 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
13db0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
13dc0 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68  NULLs..** All th
13dd0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
13de0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  is initialize th
13df0 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e  e register given
13e00 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   by rMayHaveNull
13e10 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61  .** to NULL.  Ca
13e20 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77  lling routines w
13e30 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ill take care of
13e40 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72   changing this r
13e50 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65  egister.** value
13e60 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   to non-NULL if 
13e70 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
13e80 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  free..**.** For 
13e90 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
13ea0 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74  TS operator, ret
13eb0 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
13ec0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a   that holds the.
13ed0 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  ** result.  For 
13ee0 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53  a multi-column S
13ef0 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73 75 6c  ELECT, the resul
13f00 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
13f10 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61   contiguous.** a
13f20 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
13f30 73 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  s and the return
13f40 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72 65   value is the re
13f50 67 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65  gister of the le
13f60 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c  ft-most.** resul
13f70 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72  t column.  Retur
13f80 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65 72 61  n 0 for IN opera
13f90 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72  tors or if an er
13fa0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23  ror occurs..*/.#
13fb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13fc0 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
13fd0 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
13fe0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
13ff0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
14000 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14010 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
14020 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
14030 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
14040 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
14050 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
14060 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20  HasNullFlag,    
14070 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
14080 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
14090 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
140a0 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
140b0 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
140c0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
140d0 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
140e0 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
140f0 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44  .){.  int jmpIfD
14100 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20  ynamic = -1;    
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
14130 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
14140 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
14170 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
14180 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
14190 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
141a0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
141b0 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
141c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
141d0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
141e0 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
141f0 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
14200 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53  of the IN/EXISTS
14210 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  /SELECT must be 
14220 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74  repeated every t
14230 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65  ime it.  ** is e
14240 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e  ncountered if an
14250 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
14260 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
14270 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
14280 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
14290 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
142a0 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
142b0 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
142c0 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
142d0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
142e0 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
142f0 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
14300 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
14310 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
14320 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
14330 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
14340 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
14350 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
14360 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
14370 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
14380 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
14390 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
143a0 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
143b0 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
143c0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
143d0 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
143e0 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61  ){.    jmpIfDyna
143f0 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  mic = sqlite3Cod
14400 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
14410 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14420 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14430 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
14440 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
14450 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
14460 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
14470 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
14480 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54  rse->db, "EXECUT
14490 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20  E %s%s SUBQUERY 
144a0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70  %d",.        jmp
144b0 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a  IfDynamic>=0?"":
144c0 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20  "CORRELATED ",. 
144d0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
144e0 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22  ==TK_IN?"LIST":"
144f0 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20  SCALAR",.       
14500 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14510 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20  lectId.    );.  
14520 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14530 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
14540 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
14550 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
14560 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
14570 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69   }.#endif..  swi
14580 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
14590 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
145a0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
145b0 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
145c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
145d0 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
145e0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
145f0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
14600 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
14610 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53  Left; /* the LHS
14620 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
14630 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79  tor */.      Key
14640 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
14650 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
14660 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
14670 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20       int nVal;  
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
146a0 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20  or pLeft */.    
146b0 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20    .      nVal = 
146c0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
146d0 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
146e0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
146f0 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20  owid || nVal==1 
14700 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
14710 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
14720 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
14730 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
14740 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
14750 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
14760 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
14770 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65   same way.  An e
14780 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
14790 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
147a0 65 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65  ed with index ke
147b0 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
147c0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
147d0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53   the .      ** S
147e0 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
147f0 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
14800 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
14810 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
14820 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
14830 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
14840 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
14850 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
14860 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
14870 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
14880 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
14890 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
148a0 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
148b0 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
148c0 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
148d0 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
148e0 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
148f0 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
14900 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
14910 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
14920 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
14930 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
14940 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
14950 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
14960 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
14970 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
14980 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
14990 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
149a0 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
149b0 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
149c0 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
149d0 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
149e0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
149f0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
14a00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
14a10 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
14a20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
14a30 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64  iTable, (isRowid
14a40 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20  ?0:nVal));.     
14a50 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
14a60 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
14a70 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
14a80 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20  arse->db, nVal, 
14a90 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45  1);..      if( E
14aa0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14ab0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
14ac0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
14ad0 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
14ae0 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
14af0 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
14b00 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
14b10 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
14b20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
14b30 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
14b40 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
14b50 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
14b60 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
14b70 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
14b80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c    */.        Sel
14b90 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70  ect *pSelect = p
14ba0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
14bb0 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
14bc0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  t *pEList = pSel
14bd0 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  ect->pEList;..  
14be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
14bf0 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  sRowid );.      
14c00 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20    /* If the LHS 
14c10 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49  and RHS of the I
14c20 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f  N operator do no
14c30 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20  t match, that.  
14c40 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77        ** error w
14c50 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61  ill have been ca
14c60 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65  ught long before
14c70 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
14c80 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  oint. */.       
14c90 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69   if( ALWAYS(pELi
14ca0 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29  st->nExpr==nVal)
14cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
14cc0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
14cd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
14ce0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14cf0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
14d00 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
14d10 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
14d20 20 20 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a            dest.z
14d30 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e  AffSdst = exprIN
14d40 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
14d50 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
14d60 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
14d70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
14d80 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
14d90 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
14da0 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
14db0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
14dc0 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65   testcase( pSele
14dd0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
14de0 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
14df0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14e00 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b  ( pKeyInfo==0 );
14e10 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f   /* Caused by OO
14e20 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  M in sqlite3KeyI
14e30 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  nfoAlloc() */.  
14e40 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
14e50 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14e60 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
14e70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14e80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
14e90 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e  Parse->db, dest.
14ea0 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  zAffSdst);.     
14eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
14ec0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
14ed0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
14ee0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
14ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14f00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14f10 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74  pParse->db, dest
14f20 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20  .zAffSdst);.    
14f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
14f40 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20  eyInfo!=0 ); /* 
14f50 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65  OOM will cause e
14f60 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65  xit after sqlite
14f70 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20  3Select() */.   
14f80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14f90 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
14fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14fb0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
14fc0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
14fd0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
14fe0 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
14ff0 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
15000 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15010 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
15020 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
15030 20 28 6e 56 61 6c 3e 31 29 20 3f 20 73 71 6c 69   (nVal>1) ? sqli
15040 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
15050 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 20  bexpr(pLeft, i) 
15060 3a 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  : pLeft;.       
15070 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
15080 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
15090 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
150a0 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20 20  llSeq(.         
150b0 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
150c0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
150d0 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20  Expr.           
150e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
150f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15100 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
15110 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
15120 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
15130 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
15140 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
15150 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
15160 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
15170 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
15180 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
15190 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
151a0 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
151b0 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
151c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
151d0 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
151e0 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
151f0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
15200 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
15210 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
15220 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
15230 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
15240 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
15250 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
15260 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
15270 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
15280 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
15290 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
152a0 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
152b0 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20   the IN */.     
152c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
152d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
152e0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
152f0 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75  st;.        stru
15300 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15310 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20   *pItem;.       
15320 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
15330 0a 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e 69  ..        affini
15340 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
15350 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
15360 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
15370 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
15380 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
15390 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
153a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
153b0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
153c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
153d0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
153e0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
153f0 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
15400 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
15410 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
15420 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
15430 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15440 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
15450 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
15460 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
15470 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
15480 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
15490 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
154a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
154b0 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
154c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
154d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
154e0 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73   if( isRowid ) s
154f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15500 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
15510 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  r2);.        for
15520 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
15530 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
15540 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
15550 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
15560 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
15570 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
15580 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73     int iValToIns
15590 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
155a0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
155b0 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
155c0 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
155d0 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
155e0 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
155f0 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
15600 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
15610 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
15620 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
15630 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
15640 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
15650 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
15660 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
15670 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
15680 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
15690 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
156a0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
156b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d            if( jm
156c0 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26  pIfDynamic>=0 &&
156d0 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
156e0 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
156f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15700 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
15710 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  oop(v, jmpIfDyna
15720 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mic);.          
15730 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
15740 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
15750 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
15760 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
15770 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
15780 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
15790 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
157a0 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
157b0 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
157c0 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
157d0 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
157e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
157f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15800 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
15810 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
15820 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
15830 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15840 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
15850 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
15860 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
15870 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
15880 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
15890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
158a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
158b0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
158c0 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
158f0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
15900 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
15910 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
15920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
15930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15940 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
15950 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
15960 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
15970 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15980 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15990 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
159a0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
159b0 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
159c0 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
159d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
159e0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
159f0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
15a00 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
15a10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15a20 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
15a30 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
15a40 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  ble, r2);.      
15a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15a60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15a80 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15a90 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
15aa0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15ab0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15ac0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
15ad0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
15ae0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15af0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
15b00 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
15b10 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
15b20 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
15b30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15b40 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
15b50 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
15b60 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
15b70 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
15b80 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45  * Case 3:    (SE
15b90 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
15ba0 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .).      **     
15bb0 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45  or:    EXISTS(SE
15bc0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
15bd0 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .).      **.    
15be0 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43    ** For a SELEC
15bf0 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
15c00 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75   to put the valu
15c10 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d  es for all colum
15c20 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ns of.      ** t
15c30 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74  he first row int
15c40 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
15c50 67 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75  gisters and retu
15c60 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
15c70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
15c80 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20  st register..   
15c90 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
15ca0 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49  f this is an EXI
15cb0 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e  STS, write an in
15cc0 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69  teger 0 (not exi
15cd0 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74  sts) or 1 (exist
15ce0 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  s).      ** into
15cf0 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20   a register and 
15d00 72 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69  return that regi
15d10 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20  ster number..   
15d20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
15d30 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
15d40 65 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65  e query is augme
15d50 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54  nted with "LIMIT
15d60 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20   1".  Any .     
15d70 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20   ** preexisting 
15d80 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64  limit is discard
15d90 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ed in place of t
15da0 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a  he new LIMIT 1..
15db0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53        */.      S
15dc0 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
15df0 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
15e00 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  de */.      Sele
15e10 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e30 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
15e40 20 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73   with SELECT res
15e50 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
15e60 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e80 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
15e90 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
15ea0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15eb0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
15ec0 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
15ed0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
15ee0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
15ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
15f00 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
15f10 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
15f20 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
15f30 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
15f40 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15f50 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15f60 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20   );..      pSel 
15f70 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
15f80 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d  ct;.      nReg =
15f90 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
15fa0 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45  ELECT ? pSel->pE
15fb0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b  List->nExpr : 1;
15fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15fd0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
15fe0 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  st, 0, pParse->n
15ff0 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50  Mem+1);.      pP
16000 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
16010 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  eg;.      if( pE
16020 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
16030 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65  CT ){.        de
16040 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d  st.eDest = SRT_M
16050 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  em;.        dest
16060 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53  .iSdst = dest.iS
16070 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64  DParm;.        d
16080 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67  est.nSdst = nReg
16090 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
160a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
160b0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e  P_Null, 0, dest.
160c0 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53  iSDParm, dest.iS
160d0 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20  DParm+nReg-1);. 
160e0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
160f0 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
16100 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
16110 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16120 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
16130 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
16140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16150 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16160 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
16170 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
16180 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
16190 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
161a0 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
161b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
161c0 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
161d0 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d  ->db, pSel->pLim
161e0 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
161f0 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
16200 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
16210 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
16220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f     &sqlite3IntTo
16250 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20  kens[1]);.      
16260 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pSel->iLimit = 0
16270 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65  ;.      pSel->se
16280 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75  lFlags &= ~SF_Mu
16290 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  ltiValue;.      
162a0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
162b0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
162c0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
162d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
162e0 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
162f0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
16300 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
16310 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16320 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
16330 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16340 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e    }..  if( rHasN
16350 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  ullFlag ){.    s
16360 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
16370 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69  Flag(v, pExpr->i
16380 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46  Table, rHasNullF
16390 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lag);.  }..  if(
163a0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
163b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
163c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
163d0 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
163e0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
163f0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
16400 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
16410 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
16420 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16430 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
16440 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16450 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49  RY./*.** Expr pI
16460 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  n is an IN(...) 
16470 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
16480 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
16490 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75   that the .** su
164a0 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20  b-select on the 
164b0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20  RHS of the IN() 
164c0 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65  operator has the
164d0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
164e0 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74  .** columns as t
164f0 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
16500 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65   LHS. Or, if the
16510 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29   RHS of the IN()
16520 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75   is not .** a su
16530 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74 68  b-query, that th
16540 65 20 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f  e LHS is a vecto
16550 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a  r of size 1..*/.
16560 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
16570 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50  heckIN(Parse *pP
16580 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29  arse, Expr *pIn)
16590 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20  {.  int nVector 
165a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
165b0 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65  torSize(pIn->pLe
165c0 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d  ft);.  if( (pIn-
165d0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
165e0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66  elect) ){.    if
165f0 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e  ( nVector!=pIn->
16600 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
16610 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
16620 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
16630 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
16640 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  pIn->x.pSelect->
16650 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e  pEList->nExpr, n
16660 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72  Vector);.      r
16670 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
16680 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74   }else if( nVect
16690 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  or!=1 ){.    if(
166a0 20 28 70 49 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c   (pIn->pLeft->fl
166b0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
166c0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
166d0 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
166e0 6f 72 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  or(pParse, nVect
166f0 6f 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  or, 1);.    }els
16700 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
16710 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16720 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   "row value misu
16730 73 65 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  sed");.    }.   
16740 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
16750 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
16760 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
16770 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16780 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
16790 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20   code for an IN 
167a0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
167b0 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  *      x IN (SEL
167c0 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20  ECT ...).**     
167d0 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61   x IN (value, va
167e0 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  lue, ...).**.** 
167f0 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
16800 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63  de (LHS) is a sc
16810 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65  alar or vector e
16820 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20  xpression.  The 
16830 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
16840 69 64 65 20 28 52 48 53 29 20 69 73 20 61 6e 20  ide (RHS) is an 
16850 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
16860 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c   more scalar val
16870 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62  ues, or a.** sub
16880 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 52  query.  If the R
16890 48 53 20 69 73 20 61 20 73 75 62 71 75 65 72 79  HS is a subquery
168a0 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
168b0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
168c0 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65  ust.** match the
168d0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
168e0 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ns in the vector
168f0 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66   on the LHS.  If
16900 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61   the RHS is.** a
16910 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c   list of values,
16920 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65   the LHS must be
16930 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a   a scalar. .**.*
16940 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * The IN operato
16950 72 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  r is true if the
16960 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f   LHS value is co
16970 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
16980 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72  he RHS..** The r
16990 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69  esult is false i
169a0 66 20 74 68 65 20 4c 48 53 20 69 73 20 64 65 66  f the LHS is def
169b0 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74  initely not in t
169c0 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a  he RHS.  The .**
169d0 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20   result is NULL 
169e0 69 66 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  if the presence 
169f0 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68  of the LHS in th
16a00 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20  e RHS cannot be 
16a10 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64  .** determined d
16a20 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a  ue to NULLs..**.
16a30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16a40 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
16a50 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73  hat jumps to des
16a60 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20  tIfFalse if the 
16a70 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63  LHS is not .** c
16a80 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
16a90 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65  the RHS.  If due
16aa0 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e   to NULLs we can
16ab0 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  not determine if
16ac0 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63   the LHS.** is c
16ad0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
16ae0 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  RHS then jump to
16af0 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
16b00 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
16b10 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ained.** within 
16b20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c  the RHS then fal
16b30 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a  l through..**.**
16b40 20 53 65 65 20 74 68 65 20 73 65 70 61 72 61 74   See the separat
16b50 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64  e in-operator.md
16b60 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
16b70 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e  ile in the canon
16b80 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73  ical.** SQLite s
16b90 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72 20 61  ource tree for a
16ba0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
16bb0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
16bc0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
16bd0 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65  rCodeIN(.  Parse
16be0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16bf0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
16c00 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
16c10 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
16c20 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
16c30 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70     /* The IN exp
16c40 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
16c50 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20   destIfFalse,   
16c60 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
16c70 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  if LHS is not co
16c80 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
16c90 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  HS */.  int dest
16ca0 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a  IfNull        /*
16cb0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
16cc0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  e results are un
16cd0 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c  known due to NUL
16ce0 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  Ls */.){.  int r
16cf0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20  RhsHasNull = 0; 
16d00 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
16d10 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53  t is true if RHS
16d20 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76   contains NULL v
16d30 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65  alues */.  int e
16d40 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
16d50 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
16d60 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68  RHS */.  int rLh
16d70 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
16d80 2a 20 52 65 67 69 73 74 65 72 28 73 29 20 68 6f  * Register(s) ho
16d90 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61  lding the LHS va
16da0 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c  lues */.  int rL
16db0 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20  hsOrig;         
16dc0 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72  /* LHS values pr
16dd0 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e  ior to reorderin
16de0 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a  g by aiMap[] */.
16df0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
16e00 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
16e10 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
16e20 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
16e30 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20   *aiMap = 0;    
16e40 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76     /* Map from v
16e50 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69  ector field to i
16e60 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ndex column */. 
16e70 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b   char *zAff = 0;
16e80 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
16e90 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f  ty string for co
16ea0 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69  mparisons */.  i
16eb0 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20  nt nVector;     
16ec0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
16ed0 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73  vectors for this
16ee0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
16ef0 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20    int iDummy;   
16f00 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79          /* Dummy
16f10 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78   parameter to ex
16f20 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a  prCodeVector() *
16f30 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b  /.  Expr *pLeft;
16f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16f50 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
16f60 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
16f70 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
16f80 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74     /* loop count
16f90 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  er */.  int dest
16fa0 53 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a  Step2;        /*
16fb0 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77   Where to jump w
16fc0 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69  hen NULLs seen i
16fd0 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e  n step 2 */.  in
16fe0 74 20 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b  t destStep6 = 0;
16ff0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
17000 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36 20  code for Step 6 
17010 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75  */.  int addrTru
17020 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64  thOp;      /* Ad
17030 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20  dress of opcode 
17040 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
17050 74 68 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a  the IN is true *
17060 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e  /.  int destNotN
17070 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ull;      /* Jum
17080 70 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70  p here if a comp
17090 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72  arison is not tr
170a0 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a  ue in step 6 */.
170b0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
170c0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
170d0 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f  f the step-6 loo
170e0 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d  p */ ..  pLeft =
170f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
17100 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
17110 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20  CheckIN(pParse, 
17120 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b  pExpr) ) return;
17130 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e  .  zAff = exprIN
17140 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
17150 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74   pExpr);.  nVect
17160 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
17170 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
17180 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61  ->pLeft);.  aiMa
17190 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  p = (int*)sqlite
171a0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  3DbMallocZero(. 
171b0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
171c0 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66   nVector*(sizeof
171d0 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63  (int) + sizeof(c
171e0 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20  har)) + 1.  );. 
171f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
17200 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
17210 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
17220 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72  CodeIN_oom_error
17230 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  ;..  /* Attempt 
17240 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52  to compute the R
17250 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20 73  HS. After this s
17260 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67  tep, if anything
17270 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a   other than.  **
17280 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
17290 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
172a0 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68  table opened ith
172b0 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69   cursor pExpr->i
172c0 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74  Table .  ** cont
172d0 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
172e0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
172f0 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45   RHS. If IN_INDE
17300 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e  X_NOOP is return
17310 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53  ed,.  ** the RHS
17320 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
17330 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76  n coded.  */.  v
17340 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
17350 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
17360 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d   );       /* OOM
17370 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20   detected prior 
17380 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
17390 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
173a0 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
173b0 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54  IN expr"));.  eT
173c0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
173d0 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
173e0 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20   pExpr,.        
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45       IN_INDEX_ME
17410 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e  MBERSHIP | IN_IN
17420 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20  DEX_NOOP_OK,.   
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66            destIf
17450 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
17460 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73  l ? 0 : &rRhsHas
17470 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20  Null, aiMap);.. 
17480 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
17490 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72  >nErr || nVector
174a0 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ==1 || eType==IN
174b0 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20  _INDEX_EPH.     
174c0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49    || eType==IN_I
174d0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c  NDEX_INDEX_ASC |
174e0 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
174f0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20  X_INDEX_DESC .  
17500 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
17510 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66  _DEBUG.  /* Conf
17520 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d  irm that aiMap[]
17530 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f   contains nVecto
17540 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  r integer values
17550 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20   between 0 and. 
17560 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a   ** nVector-1. *
17570 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
17580 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
17590 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20    int j, cnt;.  
175a0 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a    for(cnt=j=0; j
175b0 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69  <nVector; j++) i
175c0 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29  f( aiMap[j]==i )
175d0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65   cnt++;.    asse
175e0 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20  rt( cnt==1 );.  
175f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
17600 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65  ode the LHS, the
17610 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
17620 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20  xpr> IN (...)". 
17630 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20  If the LHS is a 
17640 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68  .  ** vector, th
17650 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20  en it is stored 
17660 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  in an array of n
17670 56 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73  Vector registers
17680 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20   starting .  ** 
17690 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  at r1..  **.  **
176a0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
176b0 64 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65  dex() might have
176c0 20 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66   reordered the f
176d0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53  ields of the LHS
176e0 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20   vector.  ** so 
176f0 74 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20  that the fields 
17700 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  are in the same 
17710 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73  order as an exis
17720 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68  ting index.   Th
17730 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61  e.  ** aiMap[] a
17740 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  rray contains a 
17750 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
17760 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69   original LHS fi
17770 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a  eld order to.  *
17780 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65  * the field orde
17790 72 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  r that matches t
177a0 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20  he RHS index..  
177b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
177c0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
177d0 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20  );.  rLhsOrig = 
177e0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
177f0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69  Parse, pLeft, &i
17800 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d  Dummy);.  for(i=
17810 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20  0; i<nVector && 
17820 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b  aiMap[i]==i; i++
17830 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66  ){} /* Are LHS f
17840 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f  ields reordered?
17850 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65   */.  if( i==nVe
17860 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c  ctor ){.    /* L
17870 48 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f  HS fields are no
17880 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20  t reordered */. 
17890 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72     rLhs = rLhsOr
178a0 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ig;.  }else{.   
178b0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72   /* Need to reor
178c0 64 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c  der the LHS fiel
178d0 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ds according to 
178e0 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68  aiMap */.    rLh
178f0 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  s = sqlite3GetTe
17900 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
17910 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f  nVector);.    fo
17920 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
17930 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
17940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17950 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73  v, OP_Copy, rLhs
17960 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d  Orig+i, rLhs+aiM
17970 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  ap[i], 0);.    }
17980 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71  .  }..  /* If sq
17990 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
179a0 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  () did not find 
179b0 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  or create an ind
179c0 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ex that is.  ** 
179d0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61  suitable for eva
179e0 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f  luating the IN o
179f0 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76  perator, then ev
17a00 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20  aluate using a. 
17a10 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20   ** sequence of 
17a20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a  comparisons..  *
17a30 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73  *.  ** This is s
17a40 74 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69  tep (1) in the i
17a50 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70  n-operator.md op
17a60 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68  timized algorith
17a70 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  m..  */.  if( eT
17a80 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f  ype==IN_INDEX_NO
17a90 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  OP ){.    ExprLi
17aa0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
17ab0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
17ac0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
17ad0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
17ae0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
17af0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  r->pLeft);.    i
17b00 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c  nt labelOk = sql
17b10 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17b20 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32  l(v);.    int r2
17b30 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20  , regToFree;.   
17b40 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d   int regCkNull =
17b50 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
17b60 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
17b70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17b80 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17b90 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  ) );.    if( des
17ba0 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
17bb0 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alse ){.      re
17bc0 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  gCkNull = sqlite
17bd0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
17be0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
17bf0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17c00 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c  OP_BitAnd, rLhs,
17c10 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c   rLhs, regCkNull
17c20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
17c30 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d  (ii=0; ii<pList-
17c40 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
17c50 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
17c60 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17c70 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
17c80 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f  i].pExpr, &regTo
17c90 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Free);.      if(
17ca0 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71   regCkNull && sq
17cb0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
17cc0 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  ll(pList->a[ii].
17cd0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
17ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17cf0 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
17d00 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c  , regCkNull, r2,
17d10 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
17d20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
17d30 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
17d40 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   || destIfNull!=
17d50 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
17d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17d70 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
17d80 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b  q, rLhs, labelOk
17d90 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17db0 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
17dc0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
17dd0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
17de0 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  f(v, ii<pList->n
17df0 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
17e00 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
17e10 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45  v, ii==pList->nE
17e20 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
17e30 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17e40 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b  eP5(v, zAff[0]);
17e50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
17e70 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
17e80 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20  False );.       
17e90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17ea0 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68  p4(v, OP_Ne, rLh
17eb0 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  s, destIfFalse, 
17ec0 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
17ee0 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
17ef0 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76  OLLSEQ); VdbeCov
17f00 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
17f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17f20 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d  ngeP5(v, zAff[0]
17f30 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
17f40 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
17f50 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
17f60 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17f70 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20  e, regToFree);. 
17f80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67     }.    if( reg
17f90 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  CkNull ){.      
17fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17fb0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
17fc0 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49  regCkNull, destI
17fd0 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65  fNull); VdbeCove
17fe0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
17ff0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
18000 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
18010 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18020 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18030 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20  l(v, labelOk);. 
18040 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
18050 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18060 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
18070 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
18080 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
18090 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
180a0 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   2: Check to see
180b0 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74   if the LHS cont
180c0 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f  ains any NULL co
180d0 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20  lumns.  If the. 
180e0 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e   ** LHS does con
180f0 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20  tain NULLs then 
18100 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  the result must 
18110 62 65 20 65 69 74 68 65 72 20 46 41 4c 53 45 20  be either FALSE 
18120 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65  or NULL..  ** We
18130 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20   will then skip 
18140 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
18150 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20  h of the RHS..  
18160 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e  */.  if( destIfN
18170 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
18180 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70   ){.    destStep
18190 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b  2 = destIfFalse;
181a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
181b0 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 53 74  stStep2 = destSt
181c0 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ep6 = sqlite3Vdb
181d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
181e0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
181f0 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
18200 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
18210 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
18220 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  ubexpr(pExpr->pL
18230 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  eft, i);.    if(
18240 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
18250 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20  eNull(p) ){.    
18260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18270 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
18280 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74  , rLhs+i, destSt
18290 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ep2);.      Vdbe
182a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
182b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65   }.  }..  /* Ste
182c0 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73  p 3.  The LHS is
182d0 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65   now known to be
182e0 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74   non-NULL.  Do t
182f0 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
18300 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53  .  ** of the RHS
18310 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61   using the LHS a
18320 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66  s a probe.  If f
18330 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74  ound, the result
18340 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20   is.  ** true.. 
18350 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
18360 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
18370 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
18380 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
18390 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  is the ROWID of 
183a0 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64  table b-tree and
183b0 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20   so we also.    
183c0 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ** know that the
183d0 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c   RHS is non-NULL
183e0 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d  .  Hence, we com
183f0 62 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64  bine steps 3 and
18400 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61   4.    ** into a
18410 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
18420 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
18430 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
18440 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d  eekRowid, pExpr-
18450 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
18460 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20  alse, rLhs);.   
18470 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18480 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  ;.    addrTruthO
18490 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
184a0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
184b0 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72  );  /* Return Tr
184c0 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ue */.  }else{. 
184d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
184e0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
184f0 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74  ity, rLhs, nVect
18500 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
18510 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64  ctor);.    if( d
18520 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
18530 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
18540 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20  /* Combine Step 
18550 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74  3 and Step 5 int
18560 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
18570 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
18580 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
18590 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
185a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
185b0 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20  estIfFalse,.    
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65         rLhs, nVe
185e0 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72  ctor); VdbeCover
185f0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f  age(v);.      go
18600 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
18610 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  deIN_finished;. 
18620 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69     }.    /* Ordi
18630 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72  nary Step 3, for
18640 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
18650 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61  FALSE and NULL a
18660 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
18670 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d     addrTruthOp =
18680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18690 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
186a0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
186b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c             rLhs,
186e0 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43   nVector); VdbeC
186f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
18700 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49  .  /* Step 4.  I
18710 66 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f  f the RHS is kno
18720 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c  wn to be non-NUL
18730 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74  L and we did not
18740 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61   find.  ** an ma
18750 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63  tch on the searc
18760 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  h above, then th
18770 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
18780 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69   FALSE..  */.  i
18790 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26  f( rRhsHasNull &
187a0 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a  & nVector==1 ){.
187b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
187c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
187d0 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  ull, rRhsHasNull
187e0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
187f0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18800 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  (v);.  }..  /* S
18810 74 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f  tep 5.  If we do
18820 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
18830 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  the difference b
18840 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a  etween NULL and.
18850 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e    ** FALSE, then
18860 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c   just return fal
18870 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  se. .  */.  if( 
18880 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
18890 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65  tIfNull ) sqlite
188a0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
188b0 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a  tIfFalse);..  /*
188c0 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68   Step 6: Loop th
188d0 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68  rough rows of th
188e0 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20  e RHS.  Compare 
188f0 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20  each row to the 
18900 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79  LHS..  ** If any
18910 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e   comparison is N
18920 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ULL, then the re
18930 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49  sult is NULL.  I
18940 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61  f all.  ** compa
18950 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45  risons are FALSE
18960 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20   then the final 
18970 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e  result is FALSE.
18980 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61  .  **.  ** For a
18990 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20   scalar LHS, it 
189a0 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
189b0 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20   check just the 
189c0 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f  first row.  ** o
189d0 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  f the RHS..  */.
189e0 20 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20    if( destStep6 
189f0 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  ) sqlite3VdbeRes
18a00 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
18a10 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54  tStep6);.  addrT
18a20 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
18a30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
18a40 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ind, pExpr->iTab
18a50 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  le, destIfFalse)
18a60 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
18a70 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74  (v);.  if( nVect
18a80 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74  or>1 ){.    dest
18a90 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  NotNull = sqlite
18aa0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18ab0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18ac0 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d  /* For nVector==
18ad0 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73  1, combine steps
18ae0 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65   6 and 7 by imme
18af0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e  diately returnin
18b00 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69  g.    ** FALSE i
18b10 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70  f the first comp
18b20 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55  arison is not NU
18b30 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f  LL */.    destNo
18b40 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61  tNull = destIfFa
18b50 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  lse;.  }.  for(i
18b60 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
18b70 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
18b80 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
18b90 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33  Coll;.    int r3
18ba0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
18bb0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
18bc0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63    p = sqlite3Vec
18bd0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
18be0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70  pLeft, i);.    p
18bf0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
18c00 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
18c10 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
18c20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18c30 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d  P_Column, pExpr-
18c40 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b  >iTable, i, r3);
18c50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18c60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
18c70 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74   rLhs+i, destNot
18c80 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20  Null, r3,.      
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ca0 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
18cb0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56  _COLLSEQ);.    V
18cc0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18cd0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
18ce0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18cf0 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  , r3);.  }.  sql
18d00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18d10 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
18d20 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28  stIfNull);.  if(
18d30 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
18d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18d50 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
18d60 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  tNotNull);.    s
18d70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18d80 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78  (v, OP_Next, pEx
18d90 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72  pr->iTable, addr
18da0 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65  Top+1);.    Vdbe
18db0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
18dc0 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66    /* Step 7:  If
18dd0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
18de0 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68  oint, we know th
18df0 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  at the result mu
18e00 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c  st.    ** be fal
18e10 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  se. */.    sqlit
18e20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18e30 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
18e40 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20  IfFalse);.  }.. 
18e50 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69   /* Jumps here i
18e60 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72  n order to retur
18e70 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c  n true. */.  sql
18e80 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
18e90 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29  (v, addrTruthOp)
18ea0 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ;..sqlite3ExprCo
18eb0 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20  deIN_finished:. 
18ec0 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f   if( rLhs!=rLhsO
18ed0 72 69 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  rig ) sqlite3Rel
18ee0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18ef0 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 73 71 6c  se, rLhs);.  sql
18f00 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
18f10 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65  (pParse);.  Vdbe
18f20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
18f30 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c   IN expr"));.sql
18f40 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f  ite3ExprCodeIN_o
18f50 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  om_error:.  sqli
18f60 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
18f70 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20  ->db, aiMap);.  
18f80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
18f90 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b  arse->db, zAff);
18fa0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
18fb0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
18fc0 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
18fd0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
18fe0 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47  NG_POINT./*.** G
18ff0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
19000 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
19010 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
19020 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
19030 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
19040 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
19050 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
19060 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
19070 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
19080 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
19090 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
190a0 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
190b0 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
190c0 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
190d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
190e0 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
190f0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
19100 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
19110 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
19120 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
19130 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
19140 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
19150 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57  iMem){.  if( ALW
19160 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20  AYS(z!=0) ){.   
19170 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
19180 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
19190 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
191a0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
191b0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
191c0 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
191d0 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
191e0 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
191f0 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
19200 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
19210 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
19220 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  = -value;.    sq
19230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
19240 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  up8(v, OP_Real, 
19250 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
19260 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c  )&value, P4_REAL
19270 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
19280 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19290 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
192a0 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
192b0 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
192c0 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
192d0 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
192e0 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
192f0 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  * Expr.u.zToken 
19300 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61  is always UTF8 a
19310 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  nd zero-terminat
19320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
19330 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50  id codeInteger(P
19340 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19350 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
19360 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
19370 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
19380 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
19390 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
193a0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
193b0 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
193c0 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
193d0 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
193e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  );.    if( negFl
193f0 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
19400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19410 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
19420 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
19430 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  lse{.    int c;.
19440 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
19450 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19460 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
19470 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
19480 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20  z!=0 );.    c = 
19490 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
194a0 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b  oI64(z, &value);
194b0 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c  .    if( c==0 ||
194c0 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61   (c==2 && negFla
194d0 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
194e0 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65  negFlag ){ value
194f0 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45   = c==2 ? SMALLE
19500 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75  ST_INT64 : -valu
19510 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  e; }.      sqlit
19520 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
19530 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
19540 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
19550 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29  value, P4_INT64)
19560 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
19570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19580 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
19590 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
195a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76  rMsg(pParse, "ov
195b0 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a  ersized integer:
195c0 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20   %s%s", negFlag 
195d0 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a  ? "-" : "", z);.
195e0 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  #else.#ifndef SQ
195f0 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e  LITE_OMIT_HEX_IN
19600 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20  TEGER.      if( 
19610 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
19620 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b  (z,"0x",2)==0 ){
19630 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19640 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19650 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f   "hex literal to
19660 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a  o big: %s", z);.
19670 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
19680 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
19690 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
196a0 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
196b0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
196c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
196d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
196e0 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 56 65  _DEBUG)./*.** Ve
196f0 72 69 66 79 20 74 68 65 20 63 6f 6e 73 69 73 74  rify the consist
19700 65 6e 63 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  ency of the colu
19710 6d 6e 20 63 61 63 68 65 0a 2a 2f 0a 73 74 61 74  mn cache.*/.stat
19720 69 63 20 69 6e 74 20 63 61 63 68 65 49 73 56 61  ic int cacheIsVa
19730 6c 69 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  lid(Parse *pPars
19740 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  e){.  int i, n;.
19750 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 53    for(i=n=0; i<S
19760 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
19770 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
19780 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
19790 65 5b 69 5d 2e 69 52 65 67 3e 30 20 29 20 6e 2b  e[i].iReg>0 ) n+
197a0 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
197b0 6e 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  n==pParse->nColC
197c0 61 63 68 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ache;.}.#endif..
197d0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61  /*.** Clear a ca
197e0 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  che entry..*/.st
197f0 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45  atic void cacheE
19800 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20  ntryClear(Parse 
19810 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
19820 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20  yColCache *p){. 
19830 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20   if( p->tempReg 
19840 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
19850 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
19860 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
19870 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20  empReg) ){.     
19880 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
19890 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
198a0 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b  eg++] = p->iReg;
198b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65  .    }.    p->te
198c0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  mpReg = 0;.  }. 
198d0 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
198e0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
198f0 65 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e--;.  assert( p
19900 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19910 63 46 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65  cFailed || cache
19920 49 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20  IsValid(pParse) 
19930 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  );.}.../*.** Rec
19940 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
19950 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
19960 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
19970 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
19980 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
19990 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
199a0 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
199b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
199c0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
199d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
199e0 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
199f0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
19a00 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
19a10 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
19a20 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
19a30 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e  che *p;..  /* Un
19a40 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61  less an error ha
19a50 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69  s occurred, regi
19a60 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
19a70 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
19a80 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
19a90 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  Reg>0 || pParse-
19aa0 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
19ab0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19ac0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  d );.  assert( i
19ad0 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
19ae0 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
19af0 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
19b00 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
19b10 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
19b20 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
19b30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
19b40 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
19b50 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
19b60 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
19b70 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
19b80 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
19b90 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
19ba0 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
19bb0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
19bc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70  e..  */.  if( Op
19bd0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
19be0 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
19bf0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
19c00 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  e) ) return;..  
19c10 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
19c20 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
19c30 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
19c40 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
19c50 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
19c60 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
19c70 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
19c80 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
19c90 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
19ca0 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
19cb0 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
19cc0 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
19cd0 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
19ce0 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
19cf0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
19d00 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
19d10 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
19d20 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , p++){.    asse
19d30 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c  rt( p->iReg==0 |
19d40 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  | p->iTable!=iTa
19d50 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21  b || p->iColumn!
19d60 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  =iCol );.  }.#en
19d70 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61  dif..  /* Find a
19d80 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64  n empty slot and
19d90 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20   replace it */. 
19da0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
19db0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
19dc0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
19dd0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
19de0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
19df0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  0 ){.      p->iL
19e00 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
19e10 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20  CacheLevel;.    
19e20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
19e30 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  ab;.      p->iCo
19e40 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
19e50 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
19e60 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  g;.      p->temp
19e70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Reg = 0;.      p
19e80 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
19e90 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
19ea0 20 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43     pParse->nColC
19eb0 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73  ache++;.      as
19ec0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
19ed0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
19ee0 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70  | cacheIsValid(p
19ef0 50 61 72 73 65 29 20 29 3b 0a 20 20 20 20 20 20  Parse) );.      
19f00 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
19f10 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  }..  /* Replace 
19f20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c  the last recentl
19f30 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c  y used */.  minL
19f40 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  ru = 0x7fffffff;
19f50 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a  .  idxLru = -1;.
19f60 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
19f70 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
19f80 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
19f90 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
19fa0 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d      if( p->lru<m
19fb0 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69  inLru ){.      i
19fc0 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
19fd0 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
19fe0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
19ff0 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e  ( ALWAYS(idxLru>
1a000 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  =0) ){.    p = &
1a010 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1a020 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70  e[idxLru];.    p
1a030 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
1a040 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
1a050 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
1a060 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  iTab;.    p->iCo
1a070 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
1a080 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
1a090 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
1a0a0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20  = 0;.    p->lru 
1a0b0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1a0c0 43 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Cnt++;.    asser
1a0d0 74 28 20 63 61 63 68 65 49 73 56 61 6c 69 64 28  t( cacheIsValid(
1a0e0 70 50 61 72 73 65 29 20 29 3b 0a 20 20 20 20 72  pParse) );.    r
1a0f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eturn;.  }.}../*
1a100 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
1a110 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77  t registers betw
1a120 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e  een iReg..iReg+n
1a130 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20  Reg-1 are being 
1a140 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20  overwritten..** 
1a150 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20  Purge the range 
1a160 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f  of registers fro
1a170 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
1a180 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  he..*/.void sqli
1a190 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1a1a0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1a1b0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
1a1c0 6e 52 65 67 29 7b 0a 20 20 73 74 72 75 63 74 20  nReg){.  struct 
1a1d0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
1a1e0 69 66 28 20 69 52 65 67 3c 3d 30 20 7c 7c 20 70  if( iReg<=0 || p
1a1f0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1a200 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1a210 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
1a220 6c 43 61 63 68 65 5b 53 51 4c 49 54 45 5f 4e 5f  lCache[SQLITE_N_
1a230 43 4f 4c 43 41 43 48 45 2d 31 5d 3b 0a 20 20 77  COLCACHE-1];.  w
1a240 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28  hile(1){.    if(
1a250 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67   p->iReg >= iReg
1a260 20 26 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52   && p->iReg < iR
1a270 65 67 2b 6e 52 65 67 20 29 20 63 61 63 68 65 45  eg+nReg ) cacheE
1a280 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
1a290 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  , p);.    if( p=
1a2a0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1a2b0 68 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  he ) break;.    
1a2c0 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p--;.  }.}../*.*
1a2d0 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
1a2e0 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61  urrent column ca
1a2f0 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e  che context.  An
1a300 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64  y new entries ad
1a310 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  ded.** added to 
1a320 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a330 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c   after this call
1a340 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65   are removed whe
1a350 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  n the.** corresp
1a360 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72  onding pop occur
1a370 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1a380 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1a390 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1a3a0 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
1a3b0 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20  Level++;.#ifdef 
1a3c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1a3d0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
1a3e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
1a3f0 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
1a400 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48      printf("PUSH
1a410 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
1a420 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
1a430 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
1a440 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
1a450 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1a460 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
1a470 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
1a480 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
1a490 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45  revious sqlite3E
1a4a0 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65  xprCachePush ope
1a4b0 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  ration.  In othe
1a4c0 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65  r words, restore
1a4d0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f  .** the cache to
1a4e0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
1a4f0 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d  s in prior the m
1a500 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e  ost recent Push.
1a510 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a520 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72  ExprCachePop(Par
1a530 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
1a540 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1a550 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
1a560 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
1a570 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b  CacheLevel>=1 );
1a580 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
1a590 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66  eLevel--;.#ifdef
1a5a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1a5b0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
1a5c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
1a5d0 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
1a5e0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50  .    printf("POP
1a5f0 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72    to %d\n", pPar
1a600 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
1a610 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  ;.  }.#endif.  f
1a620 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1a630 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1a640 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1a650 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1a660 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
1a670 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
1a680 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
1a690 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
1a6a0 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
1a6b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1a6c0 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
1a6d0 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
1a6e0 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
1a6f0 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
1a700 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
1a710 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
1a720 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
1a730 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
1a740 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
1a750 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
1a760 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
1a770 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
1a780 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
1a790 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
1a7a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1a7b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
1a7c0 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
1a7d0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
1a7e0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
1a7f0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1a800 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
1a810 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1a820 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1a830 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1a840 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1a850 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
1a860 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
1a870 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
1a880 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1a890 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20   that will load 
1a8a0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65  into register re
1a8b0 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61  gOut a value tha
1a8c0 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69  t is.** appropri
1a8d0 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78  ate for the iIdx
1a8e0 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1a8f0 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a   index pIdx..*/.
1a900 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1a910 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c  CodeLoadIndexCol
1a920 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1a930 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61  arse,  /* The pa
1a940 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1a950 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
1a960 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1a970 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20  whose column is 
1a980 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
1a990 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
1a9a0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1a9b0 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
1a9c0 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  row */.  int iId
1a9d0 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20  xCol,    /* The 
1a9e0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1a9f0 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64  dex to be loaded
1aa00 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1aa10 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
1aa20 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
1aa30 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
1aa40 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
1aa50 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64  16 iTabCol = pId
1aa60 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78  x->aiColumn[iIdx
1aa70 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62  Col];.  if( iTab
1aa80 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  Col==XN_EXPR ){.
1aa90 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1aaa0 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20  ->aColExpr );.  
1aab0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1aac0 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e  aColExpr->nExpr>
1aad0 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70  iIdxCol );.    p
1aae0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1aaf0 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73  = iTabCur;.    s
1ab00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
1ab10 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  py(pParse, pIdx-
1ab20 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64  >aColExpr->a[iId
1ab30 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67  xCol].pExpr, reg
1ab40 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
1ab50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ab60 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1ab70 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  le(pParse->pVdbe
1ab80 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  , pIdx->pTable, 
1ab90 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
1abc0 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCol, regOut);. 
1abd0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1abe0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
1abf0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
1ac00 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
1ac10 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
1ac20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ac30 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1ac40 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
1ac50 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
1ac60 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
1ac70 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1ac80 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1ac90 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
1aca0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
1acb0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
1acc0 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
1acd0 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
1ace0 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
1acf0 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
1ad00 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
1ad10 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1ad20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
1ad30 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
1ad40 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
1ad50 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1ad60 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
1ad70 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
1ad80 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
1ad90 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
1ada0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1adb0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
1adc0 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
1add0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1ade0 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
1adf0 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
1ae00 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
1ae10 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
1ae20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
1ae30 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1ae40 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
1ae50 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73  ) ){.      x = s
1ae60 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1ae70 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61  dex(sqlite3Prima
1ae80 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
1ae90 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iCol);.    }. 
1aea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1aeb0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
1aec0 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b  Cur, x, regOut);
1aed0 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
1aee0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1aef0 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
1af00 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65  , pTab, iCol, re
1af10 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
1af20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1af30 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
1af40 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
1af50 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
1af60 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
1af70 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
1af80 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67  n value in a reg
1af90 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e  ister. .**.** An
1afa0 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
1afb0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
1afc0 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
1afd0 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69  ister iReg.  Thi
1afe0 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61  s.** is not gara
1aff0 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f  nteeed for GetCo
1b000 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73  lumn() - the res
1b010 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  ult can be store
1b020 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69  d in.** any regi
1b030 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72  ster.  But the r
1b040 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
1b050 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72  eed to land in r
1b060 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20  egister iReg.** 
1b070 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52  for GetColumnToR
1b080 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  eg()..**.** Ther
1b090 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
1b0a0 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
1b0b0 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
1b0c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1b0d0 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
1b0e0 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
1b0f0 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
1b100 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
1b110 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
1b120 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1b130 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
1b140 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1b150 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1b160 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1b170 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1b180 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1b190 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1b1a0 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1b1b0 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1b1c0 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1b1d0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1b1e0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1b1f0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1b200 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1b210 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1b220 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1b230 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
1b240 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1b250 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
1b260 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
1b270 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
1b280 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b  mn + FLAGS */.){
1b290 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1b2a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1b2b0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
1b2c0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
1b2d0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1b2e0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1b2f0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1b300 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1b310 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26   if( p->iReg>0 &
1b320 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
1b330 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
1b340 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
1b350 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
1b360 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
1b370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b380 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
1b390 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69  ter(pParse, p->i
1b3a0 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Reg);.      retu
1b3b0 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20  rn p->iReg;.    
1b3c0 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74  }.  }  .  assert
1b3d0 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
1b3e0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1b3f0 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
1b400 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  Tab, iTable, iCo
1b410 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69  lumn, iReg);.  i
1b420 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c  f( p5 ){.    sql
1b430 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1b440 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65  (v, p5);.  }else
1b450 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  {   .    sqlite3
1b460 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1b470 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69  Parse, iTable, i
1b480 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1b490 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
1b4a0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1b4b0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1b4c0 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20  nToReg(.  Parse 
1b4d0 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
1b4e0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
1b4f0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
1b500 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
1b510 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
1b520 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
1b530 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
1b540 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
1b550 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
1b560 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
1b570 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
1b580 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1b590 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
1b5a0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
1b5b0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1b5c0 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg         /* St
1b5d0 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
1b5e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20   */.){.  int r1 
1b5f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1b600 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
1b610 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e  e, pTab, iColumn
1b620 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20  , iTable, iReg, 
1b630 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52  0);.  if( r1!=iR
1b640 65 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  eg ) sqlite3Vdbe
1b650 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
1b660 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
1b670 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f  r1, iReg);.}.../
1b680 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63  *.** Clear all c
1b690 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72  olumn cache entr
1b6a0 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ies..*/.void sql
1b6b0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1b6c0 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
1b6d0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1b6e0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1b6f0 70 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  p;..#if SQLITE_D
1b700 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1b710 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1b720 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1b730 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1b740 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
1b750 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
1b760 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1b770 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
1b780 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
1b790 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1b7a0 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20  ( p->iReg ){.   
1b7b0 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
1b7c0 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
1b7d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b7e0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
1b7f0 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
1b800 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
1b810 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
1b820 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
1b830 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
1b840 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
1b850 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1b860 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
1b870 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
1b880 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
1b890 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
1b8a0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
1b8b0 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75  se, iStart, iCou
1b8c0 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  nt);.}../*.** Ge
1b8d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
1b8e0 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
1b8f0 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
1b900 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
1b910 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
1b920 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
1b930 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b940 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
1b950 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b960 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
1b970 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
1b980 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
1b990 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
1b9a0 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65  ( iFrom>=iTo+nRe
1b9b0 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c  g || iFrom+nReg<
1b9c0 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65  =iTo );.  sqlite
1b9d0 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
1b9e0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
1b9f0 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
1ba00 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  nReg);.  sqlite3
1ba10 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1ba20 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e  pParse, iFrom, n
1ba30 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Reg);.}..#if def
1ba40 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1ba50 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1ba60 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
1ba70 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1ba80 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
1ba90 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
1baa0 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
1bab0 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
1bac0 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
1bad0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1bae0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1baf0 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74  tine is used wit
1bb00 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64  hin assert() and
1bb10 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
1bb20 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64  os only.** and d
1bb30 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
1bb40 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
1bb50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bb60 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
1bb70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1bb80 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
1bb90 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
1bba0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1bbb0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
1bbc0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1bbd0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
1bbe0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
1bbf0 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
1bc00 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
1bc10 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
1bc20 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
1bc30 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  ;    /*NO_TEST*/
1bc40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1bc50 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1bc60 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c  ITE_DEBUG || SQL
1bc70 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
1bc80 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  T */.../*.** Con
1bc90 76 65 72 74 20 61 20 73 63 61 6c 61 72 20 65 78  vert a scalar ex
1bca0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
1bcb0 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72   a TK_REGISTER r
1bcc0 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65  eferencing.** re
1bcd0 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1bce0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
1bcf0 73 75 72 65 20 74 68 61 74 20 69 52 65 67 20 61  sure that iReg a
1bd00 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a  lready contains.
1bd10 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  ** the correct v
1bd20 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78 70  alue for the exp
1bd30 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ression..*/.stat
1bd40 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65  ic void exprToRe
1bd50 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20  gister(Expr *p, 
1bd60 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e  int iReg){.  p->
1bd70 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
1bd80 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
1bd90 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
1bda0 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
1bdb0 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
1bdc0 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  P_Skip);.}../*.*
1bdd0 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78  * Evaluate an ex
1bde0 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72  pression (either
1bdf0 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
1be00 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
1be10 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74  ) and store.** t
1be20 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e  he result in con
1be30 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61  tinguous tempora
1be40 72 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52  ry registers.  R
1be50 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1be60 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
1be70 72 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f  register used to
1be80 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1be90 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1bea0 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1beb0 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
1bec0 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20  mporary scalar, 
1bed0 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
1bee0 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72  ** that register
1bef0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69   number into *pi
1bf00 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68  Freeable.  If th
1bf10 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1bf20 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73  t register.** is
1bf30 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
1bf40 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
1bf50 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f  ssion is a vecto
1bf60 72 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c  r set *piFreeabl
1bf70 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74  e.** to 0..*/.st
1bf80 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
1bf90 65 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70  eVector(Parse *p
1bfa0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
1bfb0 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29  int *piFreeable)
1bfc0 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b  {.  int iResult;
1bfd0 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d  .  int nResult =
1bfe0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
1bff0 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28  orSize(p);.  if(
1c000 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20   nResult==1 ){. 
1c010 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c     iResult = sql
1c020 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1c030 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72  (pParse, p, piFr
1c040 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  eeable);.  }else
1c050 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c  {.    *piFreeabl
1c060 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
1c070 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
1c080 29 7b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74  ){.      iResult
1c090 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
1c0a0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
1c0b0 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  p, 0, 0);.    }e
1c0c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1c0d0 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  ;.      iResult 
1c0e0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1c0f0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1c100 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b  nMem += nResult;
1c110 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1c120 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b  i<nResult; i++){
1c130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c140 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1c150 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69   p->x.pList->a[i
1c160 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75  ].pExpr, i+iResu
1c170 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lt);.      }.   
1c180 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c190 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  iResult;.}.../*.
1c1a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1c1b0 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
1c1c0 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
1c1d0 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
1c1e0 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
1c1f0 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
1c200 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
1c210 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
1c220 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
1c230 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
1c240 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
1c250 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
1c260 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
1c270 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
1c280 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
1c290 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
1c2a0 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
1c2b0 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
1c2c0 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
1c2d0 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
1c2e0 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
1c2f0 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
1c300 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1c310 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
1c320 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
1c330 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
1c340 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
1c350 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
1c360 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1c370 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1c380 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1c390 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1c3a0 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
1c3b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1c3c0 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
1c3d0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1c3e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c400 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
1c410 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1c420 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
1c430 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
1c440 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
1c450 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
1c460 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1c470 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1c480 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
1c490 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1c4a0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1c4b0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
1c4c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
1c4d0 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
1c4e0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1c4f0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
1c500 20 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   r2;            
1c510 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
1c520 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
1c530 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1c540 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
1c550 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1c560 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
1c570 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20  pr tempX;       
1c580 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
1c590 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  rary expression 
1c5a0 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35  node */.  int p5
1c5b0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1c5c0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1c5d0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1c5e0 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
1c5f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c600 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1c610 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1c620 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1c630 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
1c640 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
1c650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1c660 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1c670 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
1c680 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1c690 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
1c6a0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
1c6b0 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
1c6c0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
1c6d0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
1c6e0 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
1c6f0 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
1c700 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
1c710 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
1c720 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
1c730 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
1c740 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
1c750 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
1c760 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
1c770 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
1c780 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
1c790 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
1c7a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c7b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1c7c0 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
1c7d0 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  ->sortingIdxPTab
1c7e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1c810 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
1c820 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c830 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
1c840 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
1c850 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
1c860 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
1c870 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c880 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1c890 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
1c8a0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
1c8b0 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
1c8c0 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1c8d0 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20  ->ckBase>0 ){.  
1c8e0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
1c8f0 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73  ating CHECK cons
1c900 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72  traints or inser
1c910 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61  ting into partia
1c920 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
1c930 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
1c940 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50  pr->iColumn + pP
1c950 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20  arse->ckBase;.  
1c960 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c970 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c980 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e          /* Codin
1c990 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
1c9a0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1c9b0 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63  an index where c
1c9c0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20  olumn names.    
1c9d0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
1c9e0 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74  index refer to t
1c9f0 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63  he table to whic
1ca00 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f  h the index belo
1ca10 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ngs */.         
1ca20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
1ca30 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20  iSelfTab;.      
1ca40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ca50 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1ca60 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1ca70 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
1ca80 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
1cab0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
1cac0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
1caf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cb00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1cb10 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
1cb20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1cb30 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
1cb40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
1cb50 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1cb60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1cb70 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1cb80 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1cb90 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1cba0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1cbb0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1cbc0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
1cbd0 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
1cbe0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
1cbf0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
1cc00 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1cc10 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
1cc20 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
1cc30 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1cc40 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1cc50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1cc60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
1cc70 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
1cc80 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  get, pExpr->u.zT
1cc90 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
1cca0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ccb0 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
1ccc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ccd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1cce0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1ccf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1cd00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cd10 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
1cd20 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
1cd30 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
1cd40 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
1cd50 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
1cd60 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
1cd70 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1cd80 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1cd90 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1cda0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cdb0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1cdc0 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
1cdd0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
1cde0 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
1cdf0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1ce00 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
1ce10 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
1ce20 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
1ce30 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
1ce40 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
1ce50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
1ce60 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
1ce70 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
1ce80 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
1ce90 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
1cea0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1ceb0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1cec0 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
1ced0 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
1cee0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
1cef0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1cf00 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1cf10 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
1cf20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1cf30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1cf40 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1cf50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1cf60 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1cf70 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
1cf80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1cf90 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
1cfa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cfb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
1cfc0 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
1cfd0 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1cfe0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1cff0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
1d000 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1d010 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1d020 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20  en[0]=='?' .    
1d030 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
1d040 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
1d050 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  en, pParse->azVa
1d060 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
1d070 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1])==0 );.     
1d080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1d090 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50  angeP4(v, -1, pP
1d0a0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
1d0b0 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50  r->iColumn-1], P
1d0c0 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
1d0d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1d0e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1d0f0 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
1d100 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
1d110 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
1d120 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1d130 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d140 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
1d150 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
1d160 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
1d170 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
1d180 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
1d190 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52  en) */.      inR
1d1a0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1d1b0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1d1c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1d1d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1d1e0 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
1d1f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1d200 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d210 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
1d220 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
1d230 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
1d240 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1d250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d260 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20  Op2(v, OP_Cast, 
1d270 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d290 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
1d2a0 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
1d2b0 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ken, 0));.      
1d2c0 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
1d2d0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
1d2e0 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
1d2f0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1d300 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1d310 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1d320 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
1d330 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d340 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d350 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
1d360 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1d370 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1d380 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
1d390 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
1d3a0 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70  : TK_NE;.      p
1d3b0 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  5 = SQLITE_NULLE
1d3c0 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c  Q;.      /* fall
1d3d0 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20  -through */.    
1d3e0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1d3f0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1d400 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1d410 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1d420 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1d430 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1d440 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1d450 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1d460 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d470 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c  3ExprIsVector(pL
1d480 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
1d490 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72  codeVectorCompar
1d4a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
1d4b0 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29   target, op, p5)
1d4c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d4d0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1d4e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1d4f0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
1d500 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1d510 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1d520 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1d530 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1d540 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1d550 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
1d560 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
1d570 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1d580 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1d590 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
1d5a0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c  SQLITE_STOREP2 |
1d5b0 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73   p5);.        as
1d5c0 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
1d5d0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1d5e0 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
1d5f0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d600 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Lt);.        as
1d610 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
1d620 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1d630 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
1d640 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d650 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Le);.        as
1d660 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
1d670 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1d680 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
1d690 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d6a0 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Gt);.        as
1d6b0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
1d6c0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1d6d0 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
1d6e0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d6f0 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Ge);.        as
1d700 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
1d710 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
1d720 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
1d730 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d740 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Eq);.        as
1d750 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
1d760 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1d770 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
1d780 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d790 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  _Ne);.        te
1d7a0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1d7b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
1d7c0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1d7d0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
1d7e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d7f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1d800 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
1d810 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1d820 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
1d830 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
1d840 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
1d850 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
1d860 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
1d870 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
1d880 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
1d890 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
1d8a0 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
1d8b0 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
1d8c0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
1d8d0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1d8e0 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
1d8f0 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d );            
1d900 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d910 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  _AND );.      as
1d920 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
1d930 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  Or );           
1d940 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d950 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
1d960 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
1d970 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20  =OP_Add );      
1d980 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1d990 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
1d9a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
1d9b0 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
1d9c0 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73  t );     testcas
1d9d0 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
1d9e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d9f0 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
1da00 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65  inder );      te
1da10 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1da20 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
1da30 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
1da40 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20  P_BitAnd );     
1da50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1da60 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
1da70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1da80 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20  OR==OP_BitOr ); 
1da90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1daa0 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b   op==TK_BITOR );
1dab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1dac0 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
1dad0 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74  de );       test
1dae0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41  case( op==TK_SLA
1daf0 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  SH );.      asse
1db00 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
1db10 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20  P_ShiftLeft );  
1db20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1db30 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
1db40 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
1db50 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
1db60 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  ht );  testcase(
1db70 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
1db80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1db90 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f  TK_CONCAT==OP_Co
1dba0 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73  ncat );      tes
1dbb0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
1dbc0 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
1dbd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1dbe0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1dbf0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1dc00 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1dc10 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1dc20 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1dc30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1dc40 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1dc50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dc60 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
1dc70 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1dc80 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1dc90 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1dca0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1dcb0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1dcc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dcd0 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
1dce0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
1dcf0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
1dd00 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
1dd10 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
1dd20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1dd30 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
1dd40 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1dd50 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
1dd60 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66   1, target);.#if
1dd70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dd80 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1dd90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dda0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
1ddb0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
1ddc0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ddd0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1dde0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1ddf0 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
1de00 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
1de10 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
1de20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1de30 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  se{.        temp
1de40 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  X.op = TK_INTEGE
1de50 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  R;.        tempX
1de60 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56  .flags = EP_IntV
1de70 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  alue|EP_TokenOnl
1de80 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  y;.        tempX
1de90 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20  .u.iValue = 0;. 
1dea0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1deb0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1dec0 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
1ded0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1dee0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1def0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1df00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1df10 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1df20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1df30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
1df40 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
1df50 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1df60 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1df70 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1df80 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
1df90 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
1dfa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dfb0 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
1dfc0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1dfd0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1dfe0 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
1dff0 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
1e000 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
1e010 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
1e020 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
1e030 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
1e040 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1e050 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1e060 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e070 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e080 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1e090 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1e0a0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1e0b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  =0 );.      inRe
1e0c0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
1e0d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e0e0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
1e0f0 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
1e100 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e110 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
1e120 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
1e130 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
1e140 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
1e150 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
1e160 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
1e170 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1e180 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
1e190 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
1e1a0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
1e1b0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e1c0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1e1d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e1e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e1f0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
1e200 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e210 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e220 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e230 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e240 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e250 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e260 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
1e270 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1e280 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
1e290 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e2a0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
1e2b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1e2c0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1e2d0 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
1e2e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e2f0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1e300 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1e310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1e320 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
1e330 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e340 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e350 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
1e360 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
1e370 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
1e380 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
1e390 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
1e3a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1e3b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e3c0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e3d0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ue) );.        s
1e3e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1e3f0 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
1e400 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28  f aggregate: %s(
1e410 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  )", pExpr->u.zTo
1e420 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
1e430 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
1e440 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b   = pInfo->aFunc[
1e450 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
1e460 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
1e470 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e480 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1e490 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1e4a0 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1e4b0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1e4c0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1e4d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
1e4e0 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
1e4f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
1e500 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1e510 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
1e520 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
1e530 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
1e540 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
1e550 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  ct */.      cons
1e560 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
1e570 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
1e580 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
1e590 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   u32 constMask =
1e5a0 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
1e5b0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1e5c0 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
1e5d0 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
1e5e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1e5f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1e600 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1e610 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
1e620 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
1e630 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
1e640 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
1e650 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
1e660 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
1e670 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
1e680 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
1e690 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e6a0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e6b0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1e6c0 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
1e6d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e6e0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
1e6f0 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
1e700 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  pFarg = 0;.     
1e710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e720 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78  pFarg = pExpr->x
1e730 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  .pList;.      }.
1e740 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46        nFarg = pF
1e750 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78  arg ? pFarg->nEx
1e760 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73  pr : 0;.      as
1e770 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e780 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e790 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e7a0 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
1e7b0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1e7c0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
1e7d0 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
1e7e0 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  zId, nFarg, enc,
1e7f0 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
1e800 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57  TE_ENABLE_UNKNOW
1e810 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20  N_SQL_FUNCTION. 
1e820 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1e830 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c   && pParse->expl
1e840 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
1e850 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
1e860 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75  dFunction(db, "u
1e870 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20  nknown", nFarg, 
1e880 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  enc, 0);.      }
1e890 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
1e8a0 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65  ( pDef==0 || pDe
1e8b0 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  f->xFinalize!=0 
1e8c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e8d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e8e0 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63  e, "unknown func
1e8f0 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64  tion: %s()", zId
1e900 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1e910 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1e920 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69   /* Attempt a di
1e930 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rect implementat
1e940 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74  ion of the built
1e950 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61  -in COALESCE() a
1e960 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55  nd.      ** IFNU
1e970 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  LL() functions. 
1e980 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e   This avoids unn
1e990 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74  ecessary evaluat
1e9a0 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
1e9b0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
1e9c0 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
1e9d0 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
1e9e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1e9f0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1ea00 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
1ea10 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20  LESCE ){.       
1ea20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65   int endCoalesce
1ea30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ea40 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1ea50 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
1ea60 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=2 );.        
1ea70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1ea80 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1ea90 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
1eaa0 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
1eab0 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=1; i<nFarg; i+
1eac0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1ead0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1eae0 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74  v, OP_NotNull, t
1eaf0 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73  arget, endCoales
1eb00 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ce);.          V
1eb10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1eb20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1eb30 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1eb40 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c  (pParse, target,
1eb50 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
1eb60 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1eb70 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1eb80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1eb90 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1eba0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
1ebb0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1ebc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ebd0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1ebe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ebf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1ec00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
1ec10 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
1ec20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ec30 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68    }..      /* Th
1ec40 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e  e UNLIKELY() fun
1ec50 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1ec60 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
1ec70 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
1ec80 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
1ec90 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
1eca0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
1ecb0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1ecc0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49  SQLITE_FUNC_UNLI
1ecd0 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  KELY ){.        
1ece0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31  assert( nFarg>=1
1ecf0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
1ed00 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1ed10 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1ed20 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
1ed30 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1ed40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ed50 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
1ed60 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=0; i<nFarg; i+
1ed70 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1ed80 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45  i<32 && sqlite3E
1ed90 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46  xprIsConstant(pF
1eda0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
1edb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
1edc0 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b  stcase( i==31 );
1edd0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
1ede0 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33  Mask |= MASKBIT3
1edf0 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2(i);.        }.
1ee00 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
1ee10 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1ee20 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
1ee30 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c  OLL)!=0 && !pCol
1ee40 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
1ee50 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1ee60 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1ee70 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
1ee80 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
1ee90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1eea0 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
1eeb0 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b     if( constMask
1eec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31   ){.          r1
1eed0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1eee0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  1;.          pPa
1eef0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61  rse->nMem += nFa
1ef00 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rg;.        }els
1ef10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  e{.          r1 
1ef20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1ef30 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46  Range(pParse, nF
1ef40 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  arg);.        }.
1ef50 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
1ef60 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70  length() and typ
1ef70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  eof() functions 
1ef80 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72  with a column ar
1ef90 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  gument,.        
1efa0 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61  ** set the P5 pa
1efb0 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f  rameter to the O
1efc0 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
1efd0 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  to OPFLAG_LENGTH
1efe0 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ARG.        ** o
1eff0 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  r OPFLAG_TYPEOFA
1f000 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  RG respectively,
1f010 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65   to avoid unnece
1f020 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20  ssary data.     
1f030 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20     ** loading.. 
1f040 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f050 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
1f060 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  cFlags & (SQLITE
1f070 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c  _FUNC_LENGTH|SQL
1f080 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29  ITE_FUNC_TYPEOF)
1f090 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1f0a0 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20    u8 exprOp;.   
1f0b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1f0c0 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
1f0d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61       assert( pFa
1f0e0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  rg->a[0].pExpr!=
1f0f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  0 );.          e
1f100 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61  xprOp = pFarg->a
1f110 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  [0].pExpr->op;. 
1f120 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
1f130 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  rOp==TK_COLUMN |
1f140 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47  | exprOp==TK_AGG
1f150 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1f160 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
1f170 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
1f180 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  H==OPFLAG_LENGTH
1f190 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
1f1a0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1f1b0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f  E_FUNC_TYPEOF==O
1f1c0 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
1f1d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
1f1e0 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66  estcase( pDef->f
1f1f0 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41  uncFlags & OPFLA
1f200 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
1f210 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67             pFarg
1f220 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1f230 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 = .           
1f240 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e         pDef->fun
1f250 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47  cFlags & (OPFLAG
1f260 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41  _LENGTHARG|OPFLA
1f270 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
1f280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f290 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c    }..        sql
1f2a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1f2b0 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  h(pParse);     /
1f2c0 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
1f2d0 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20  d34be */.       
1f2e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f2f0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1f300 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20   pFarg, r1, 0,. 
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1f330 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53  QLITE_ECEL_DUP|S
1f340 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1f350 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  R);.        sqli
1f360 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1f370 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
1f380 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
1f390 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65  34be */.      }e
1f3a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1f3b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
1f3c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f3d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1f3e0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
1f3f0 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
1f400 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
1f410 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
1f420 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
1f430 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
1f440 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1f450 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
1f460 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
1f470 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
1f480 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
1f490 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
1f4a0 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
1f4b0 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
1f4c0 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
1f4d0 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
1f4e0 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
1f4f0 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
1f500 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
1f510 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
1f520 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
1f530 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
1f540 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
1f550 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
1f560 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
1f570 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
1f580 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
1f590 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1f5a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
1f5b0 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
1f5c0 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
1f5d0 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
1f5e0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
1f5f0 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
1f600 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
1f610 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
1f620 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
1f630 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
1f640 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
1f650 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
1f660 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
1f670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1f680 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70  ( nFarg>=2 && (p
1f690 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1f6a0 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
1f6b0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
1f6c0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
1f6d0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
1f6e0 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
1f6f0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
1f700 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1f710 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
1f720 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
1f730 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
1f740 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
1f750 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
1f760 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1f770 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
1f780 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
1f790 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1f7a0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
1f7b0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1f7c0 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
1f7d0 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
1f7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f7f0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
1f800 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
1f810 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1f820 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
1f830 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f840 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
1f850 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61  nction0, constMa
1f860 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a  sk, r1, target,.
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 28 63 68 61 72 2a 29 70          (char*)p
1f890 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
1f8a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f8b0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
1f8c0 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  u8)nFarg);.     
1f8d0 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f   if( nFarg && co
1f8e0 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20  nstMask==0 ){.  
1f8f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1f900 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1f910 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29  arse, r1, nFarg)
1f920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f930 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1f940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f950 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
1f960 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
1f970 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
1f980 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  : {.      int nC
1f990 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ol;.      testca
1f9a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
1f9b0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
1f9c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
1f9d0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
1f9e0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
1f9f0 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e   (nCol = pExpr->
1fa00 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
1fa10 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a  t->nExpr)!=1 ){.
1fa20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1fa30 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
1fa40 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  arse, nCol, 1);.
1fa50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fa60 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
1fa70 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
1fa80 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1fa90 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
1faa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fab0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
1fac0 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
1fad0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1fae0 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d  >pLeft->iTable==
1faf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
1fb00 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
1fb10 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  e = sqlite3CodeS
1fb20 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1fb30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
1fb40 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1fb50 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
1fb60 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
1fb70 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
1fb80 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  n;.      break;.
1fb90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1fba0 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
1fbb0 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
1fbc0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1fbd0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
1fbe0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
1fbf0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1fc00 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
1fc10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fc20 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1fc30 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
1fc40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1fc50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1fc60 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
1fc70 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1fc80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fc90 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1fca0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1fcb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1fcc0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1fcd0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1fce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fcf0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
1fd00 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
1fd10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1fd20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1fd30 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
1fd40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1fd50 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1fd60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
1fd70 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
1fd80 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
1fd90 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
1fda0 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
1fdb0 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
1fdc0 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
1fdd0 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
1fde0 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
1fdf0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
1fe00 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
1fe10 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1fe20 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
1fe30 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
1fe40 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1fe50 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
1fe60 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
1fe70 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
1fe80 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  {.      exprCode
1fe90 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
1fea0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
1feb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
1fec0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fed0 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63  e TK_SPAN:.    c
1fee0 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
1fef0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
1ff00 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
1ff10 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1ff20 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1ff30 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ff40 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
1ff50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ff60 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
1ff70 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
1ff80 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
1ff90 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
1ffa0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1ffb0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
1ffc0 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
1ffd0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
1ffe0 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
1fff0 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
20000 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
20010 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
20020 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
20030 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
20040 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
20050 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
20060 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
20070 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
20080 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
20090 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
200a0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
200b0 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
200c0 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
200d0 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
200e0 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
200f0 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
20100 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
20110 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
20120 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
20130 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
20140 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
20150 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
20160 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
20170 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
20180 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
20190 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
201a0 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
201b0 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
201c0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
201d0 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
201e0 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
201f0 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
20200 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
20210 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
20220 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
20230 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
20240 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
20250 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
20260 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
20270 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
20280 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
20290 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
202a0 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
202b0 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
202c0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
202d0 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
202e0 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
202f0 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
20300 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
20310 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
20320 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
20330 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
20340 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
20350 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
20360 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20370 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
20380 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
20390 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
203a0 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
203b0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
203c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
203d0 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
203e0 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
203f0 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
20400 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
20410 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
20420 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
20430 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
20440 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
20450 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
20460 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
20470 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
20480 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
20490 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
204a0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
204b0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
204c0 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
204d0 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
204e0 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
204f0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
20500 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
20510 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
20520 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
20530 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
20540 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
20550 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
20560 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
20570 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
20580 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
20590 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
205a0 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
205b0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
205c0 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
205d0 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
205e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
205f0 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
20600 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
20610 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
20620 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
20630 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
20640 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
20650 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
20660 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
20670 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
20680 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
20690 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
206a0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
206b0 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
206c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
206d0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
206e0 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
206f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
20700 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
20710 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
20720 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
20730 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
20740 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
20750 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
20760 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
20770 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  real..      **. 
20780 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
20790 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36  -OF: R-60985-576
207a0 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63  62 SQLite will c
207b0 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65  onvert the value
207c0 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a   back to.      *
207d0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
207e0 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67   when extracting
207f0 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63   it from the rec
20800 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ord.  */.      i
20810 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
20820 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  n>=0 .       && 
20830 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
20840 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  ->iColumn].affin
20850 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
20860 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20  REAL.      ){.  
20870 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20880 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
20890 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67  alAffinity, targ
208a0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  et);.      }.#en
208b0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
208c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
208d0 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20   TK_VECTOR: {.  
208e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
208f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
20900 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
20910 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20920 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
20930 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
20940 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
20950 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
20960 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
20970 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
20980 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
20990 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
209a0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
209b0 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
209c0 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
209d0 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
209e0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
209f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
20a00 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
20a10 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
20a20 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
20a30 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
20a40 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
20a50 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
20a60 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
20a70 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
20a80 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
20a90 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
20aa0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
20ab0 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
20ac0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
20ad0 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
20ae0 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  in the last elem
20af0 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e  ent of pExpr->x.
20b00 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e  pList if pExpr->
20b10 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69  x.pList->nExpr i
20b20 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54  s.    ** odd.  T
20b30 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
20b40 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e  ional.  If the n
20b50 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
20b60 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20  s in x.pList.   
20b70 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65   ** is even, the
20b80 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61  n Y is omitted a
20b90 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73  nd the "otherwis
20ba0 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  e" result is NUL
20bb0 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
20bc0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
20bd0 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
20be0 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
20bf0 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
20c00 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
20c10 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
20c20 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
20c30 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
20c40 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
20c50 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
20c60 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
20c70 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
20c80 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
20c90 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
20ca0 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
20cb0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
20cc0 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
20cd0 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
20ce0 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
20d10 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
20d20 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
20d30 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20d50 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
20d60 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
20d70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
20d80 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
20d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
20da0 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
20db0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
20dc0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20df0 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
20e00 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
20e30 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
20e40 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
20e50 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
20e60 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
20e70 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
20e80 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
20eb0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
20ec0 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ee0 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
20ef0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
20f00 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
20f30 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
20f40 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
20f50 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
20f60 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
20f70 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
20f80 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
20f90 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20fa0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
20fb0 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
20fc0 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
20fd0 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
20fe0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
20ff0 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
21000 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
21010 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
21020 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
21030 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
21040 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
21050 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
21060 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21070 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
21080 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
21090 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
210a0 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70        tempX = *p
210b0 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
210c0 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
210d0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
210e0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
210f0 28 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64  (&tempX, exprCod
21100 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
21110 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65  &tempX, &regFree
21120 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1));.        tes
21130 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
21140 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  =0 );.        me
21150 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c  mset(&opCompare,
21160 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d   0, sizeof(opCom
21170 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20  pare));.        
21180 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
21190 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
211a0 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
211b0 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20  &tempX;.        
211c0 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
211d0 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  re;.        /* T
211e0 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63  icket b351d95f9c
211f0 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38  d5ef17e9d9dbae18
21200 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a  f5ca8611190001:.
21210 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76          ** The v
21220 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31  alue in regFree1
21230 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79   might get SCopy
21240 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  -ed into the fil
21250 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  e result..      
21260 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72    ** So make sur
21270 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72  e that the regFr
21280 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20  ee1 register is 
21290 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f  not reused for o
212a0 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
212b0 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73  purposes and pos
212c0 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65  sibly overwritte
212d0 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  n.  */.        r
212e0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20  egFree1 = 0;.   
212f0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
21300 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69  =0; i<nExpr-1; i
21310 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
21320 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
21330 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
21340 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
21350 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21360 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
21370 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
21380 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
21390 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
213a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
213b0 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
213c0 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
213d0 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
213e0 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
213f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
21400 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
21410 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
21420 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
21430 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21440 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
21450 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
21460 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
21470 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
21480 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
21490 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
214a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
214b0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
214c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
214d0 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
214e0 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
214f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21500 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e  e3VdbeGoto(v, en
21510 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
21520 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21530 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
21540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21550 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21560 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
21570 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e    }.      if( (n
21580 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20  Expr&1)!=0 ){.  
21590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
215a0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
215b0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
215c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
215d0 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45  se, pEList->a[nE
215e0 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61  xpr-1].pExpr, ta
215f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
21600 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
21610 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
21620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21640 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
21650 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21660 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
21670 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
21680 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
21690 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  r>0 .           
216a0 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  || pParse->iCach
216b0 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65  eLevel==iCacheLe
216c0 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  vel );.      sql
216d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
216e0 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
216f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
21700 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
21710 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
21720 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
21730 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
21740 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
21750 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
21760 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
21770 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
21780 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
21790 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
217a0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
217b0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
217c0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
217d0 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
217e0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
217f0 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
21800 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
21810 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21820 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
21840 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
21850 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
21860 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
21870 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
21880 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
21890 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
218a0 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
218b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
218c0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
218d0 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
218e0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
218f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
21900 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
21910 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
21920 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
21930 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
21940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21950 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
21960 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
21970 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
21980 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
21990 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
219a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
219b0 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
219c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
219d0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
219e0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
219f0 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
21a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
21a30 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
21a40 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
21a50 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
21a60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
21a70 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
21a80 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
21a90 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
21aa0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21ab0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
21ac0 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
21ad0 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
21ae0 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
21af0 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
21b00 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
21b10 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
21b20 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
21b30 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
21b40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21b50 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
21b60 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
21b70 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
21b80 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
21b90 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
21ba0 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
21bb0 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
21bc0 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74  Dest,      /* St
21bd0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
21be0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
21bf0 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65 20  /.  u8 reusable 
21c00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21c10 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
21c20 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a   is reusable */.
21c30 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
21c40 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73  ;.  assert( Cons
21c50 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
21c60 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  ) );.  p = pPars
21c70 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
21c80 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
21c90 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
21ca0 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
21cb0 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
21cc0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
21cd0 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20  e, p, pExpr);.  
21ce0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74  if( p ){.     st
21cf0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
21d00 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
21d10 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  a[p->nExpr-1];. 
21d20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f      pItem->u.iCo
21d30 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67  nstExprReg = reg
21d40 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d  Dest;.     pItem
21d50 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75  ->reusable = reu
21d60 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61  sable;.  }.  pPa
21d70 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
21d80 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = p;.}../*.** Ge
21d90 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
21da0 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
21db0 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
21dc0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
21dd0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
21de0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
21df0 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
21e00 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
21e10 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
21e20 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
21e30 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
21e40 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
21e50 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
21e60 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
21e70 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
21e80 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
21e90 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
21ea0 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
21eb0 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
21ec0 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
21ed0 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
21ee0 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  s a constant, th
21ef0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
21f00 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74  might generate t
21f10 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66  his.** code to f
21f20 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72  ill the register
21f30 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
21f40 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f  zation section o
21f50 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  f the.** VDBE pr
21f60 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20  ogram, in order 
21f70 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74  to factor it out
21f80 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69   of the evaluati
21f90 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  on loop..*/.int 
21fa0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
21fb0 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
21fc0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
21fd0 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
21fe0 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20  t r2;.  pExpr = 
21ff0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
22000 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20  ollate(pExpr);. 
22010 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
22020 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
22030 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
22040 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
22050 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
22060 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
22070 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ).  ){.    ExprL
22080 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ist *p = pParse-
22090 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20  >pConstExpr;.   
220a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65   int i;.    *pRe
220b0 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g  = 0;.    if( 
220c0 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  p ){.      struc
220d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
220e0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
220f0 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d  r(pItem=p->a, i=
22100 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70  p->nExpr; i>0; p
22110 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20  Item++, i--){.  
22120 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
22130 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
22140 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
22150 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78  pItem->pExpr,pEx
22160 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  pr,-1)==0 ){.   
22170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
22180 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
22190 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rReg;.        }.
221a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
221b0 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d    r2 = ++pParse-
221c0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
221d0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
221e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
221f0 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  r2, 1);.  }else{
22200 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
22210 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
22220 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
22230 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
22240 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
22250 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
22260 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
22270 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
22280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22290 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
222a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
222b0 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20  1);.      *pReg 
222c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
222d0 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
222e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
222f0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
22300 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
22310 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
22320 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
22330 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
22340 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
22350 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
22360 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
22370 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
22380 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22390 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
223a0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
223b0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
223c0 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
223d0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
223e0 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
223f0 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
22400 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
22410 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
22420 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
22430 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
22440 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
22450 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
22460 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
22470 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
22480 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
22490 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
224a0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
224b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
224c0 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20  se->pVdbe!=0 || 
224d0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
224e0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
224f0 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
22500 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
22510 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
22520 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
22530 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
22540 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
22550 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
22560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
22570 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20   transient copy 
22580 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
22590 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64  xpr and then cod
225a0 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
225b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e  lite3ExprCode().
225c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
225d0 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73  orks just like s
225e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
225f0 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  .** except that 
22600 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73  the input expres
22610 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65  sion is guarante
22620 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67  ed to be unchang
22630 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
22640 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
22650 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
22660 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
22670 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74  target){.  sqlit
22680 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22690 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  >db;.  pExpr = s
226a0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
226b0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
226c0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
226d0 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78  iled ) sqlite3Ex
226e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
226f0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
22700 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
22710 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
22720 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
22730 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
22740 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
22750 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
22760 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
22770 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
22780 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
22790 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
227a0 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
227b0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
227c0 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
227d0 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
227e0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
227f0 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
22800 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
22810 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
22820 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
22830 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
22840 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
22850 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
22860 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
22870 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
22880 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
22890 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
228a0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
228b0 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
228c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
228d0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
228e0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
228f0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
22900 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22910 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22920 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
22930 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
22940 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74  ode that evaluat
22950 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
22960 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
22970 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
22980 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
22990 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
229a0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
229b0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
229c0 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
229d0 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
229e0 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
229f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
22a00 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
22a10 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
22a20 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
22a30 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
22a40 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
22a50 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
22a60 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
22a70 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
22a80 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
22a90 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
22aa0 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
22ab0 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
22ac0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
22ad0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
22ae0 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76  are reused..*/.v
22af0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
22b00 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
22b10 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
22b20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
22b30 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
22b40 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
22b50 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61    int iMem;..  a
22b60 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
22b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
22b80 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
22b90 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  TER );.  sqlite3
22ba0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
22bb0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
22bc0 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  .  iMem = ++pPar
22bd0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
22be0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22bf0 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74   OP_Copy, target
22c00 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54  , iMem);.  exprT
22c10 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c  oRegister(pExpr,
22c20 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iMem);.}../*.**
22c30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
22c40 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
22c50 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
22c60 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
22c70 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
22c80 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
22c90 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
22ca0 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
22cb0 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
22cc0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
22cd0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
22ce0 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uated..**.** The
22cf0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
22d00 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
22d10 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  he arguments fro
22d20 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65  m being.** fille
22d30 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79  d using OP_SCopy
22d40 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20  .  OP_Copy must 
22d50 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  be used instead.
22d60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
22d70 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72  E_ECEL_FACTOR ar
22d80 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f  gument allows co
22d90 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
22da0 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72   to be.** factor
22db0 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74  ed out into init
22dc0 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e  ialization code.
22dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
22de0 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20  E_ECEL_REF flag 
22df0 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65  means that expre
22e00 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69  ssions in the li
22e10 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c  st with.** ExprL
22e20 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64  ist.a[].u.x.iOrd
22e30 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61  erByCol>0 have a
22e40 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c  lready been eval
22e50 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64  uated and stored
22e60 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73  .** in registers
22e70 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20   at srcReg, and 
22e80 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e  so the value can
22e90 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20   be copied from 
22ea0 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  there..*/.int sq
22eb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
22ec0 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
22ed0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
22ee0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
22ef0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
22f00 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
22f10 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
22f20 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
22f30 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
22f40 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
22f50 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
22f60 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
22f70 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
22f80 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
22f90 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
22fa0 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
22fb0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
22fc0 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
22fd0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
22fe0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
22ff0 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
23000 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
23010 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
23020 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
23030 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
23040 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
23050 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
23060 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
23070 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
23080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
23090 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
230a0 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
230b0 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
230c0 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
230d0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
230e0 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
230f0 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
23100 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
23110 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
23120 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
23130 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
23140 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
23150 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
23160 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66  Expr;.    if( (f
23170 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
23180 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
23190 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75   = pList->a[i].u
231a0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
231b0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
231c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
231d0 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67  copyOp, j+srcReg
231e0 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  -1, target+i);. 
231f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
23200 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
23210 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20  L_FACTOR)!=0 && 
23220 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
23230 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
23240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23250 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
23260 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
23270 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  t+i, 0);.    }el
23280 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e  se{.      int in
23290 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
232a0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
232b0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
232c0 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t+i);.      if( 
232d0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20  inReg!=target+i 
232e0 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  ){.        VdbeO
232f0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20  p *pOp;.        
23300 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43  if( copyOp==OP_C
23310 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
23320 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65  (pOp=sqlite3Vdbe
23330 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f  GetOp(v, -1))->o
23340 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20  pcode==OP_Copy. 
23350 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
23360 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e  p1+pOp->p3+1==in
23370 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
23380 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b  pOp->p2+pOp->p3+
23390 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20  1==target+i.    
233a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
233b0 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20   pOp->p3++;.    
233c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
233d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
233e0 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
233f0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b  , inReg, target+
23400 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
23410 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23420 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
23430 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
23440 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
23450 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
23460 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
23470 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
23480 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
23490 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
234a0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
234b0 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
234c0 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
234d0 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
234e0 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
234f0 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20  .** elimination 
23500 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  of x..**.** The 
23510 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65  xJumpIf paramete
23520 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74  r determines det
23530 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  ails:.**.**    N
23540 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
23550 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
23560 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
23570 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20  in reg[dest].** 
23580 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
23590 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20  True:      Jump 
235a0 74 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a  to dest if true.
235b0 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  **    sqlite3Exp
235c0 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75  rIfFalse:     Ju
235d0 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61  mp to dest if fa
235e0 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75  lse.**.** The ju
235f0 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74  mpIfNull paramet
23600 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
23610 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c   xJumpIf is NULL
23620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23630 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
23640 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
23650 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
23660 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
23670 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
23680 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
23690 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
236a0 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
236b0 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
236c0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
236d0 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72  tination or stor
236e0 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  age location */.
236f0 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28    void (*xJump)(
23700 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74  Parse*,Expr*,int
23710 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e  ,int), /* Action
23720 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e   to take */.  in
23730 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
23740 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
23750 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
23760 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45  is NULL */.){. E
23770 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20  xpr exprAnd;    
23780 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72   /* The AND oper
23790 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e  ator in  x>=y AN
237a0 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70  D x<=z  */.  Exp
237b0 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f  r compLeft;    /
237c0 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72  * The  x>=y  ter
237d0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70  m */.  Expr comp
237e0 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20  Right;   /* The 
237f0 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20   x<=z  term */. 
23800 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20   Expr exprX;    
23810 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75     /* The  x  su
23820 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
23830 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
23840 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  0; /* Temporary 
23850 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
23860 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ..  memset(&comp
23870 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Left, 0, sizeof(
23880 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
23890 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20  (&compRight, 0, 
238a0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
238b0 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64   memset(&exprAnd
238c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
238d0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  ));..  assert( !
238e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
238f0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
23900 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20  ect) );.  exprX 
23910 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
23920 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20  .  exprAnd.op = 
23930 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e  TK_AND;.  exprAn
23940 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
23950 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  eft;.  exprAnd.p
23960 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
23970 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
23980 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
23990 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
239a0 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  xprX;.  compLeft
239b0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
239c0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
239d0 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68  Expr;.  compRigh
239e0 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
239f0 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
23a00 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
23a10 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
23a20 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
23a30 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70  [1].pExpr;.  exp
23a40 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70  rToRegister(&exp
23a50 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74  rX, exprCodeVect
23a60 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  or(pParse, &expr
23a70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
23a80 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20    if( xJump ){. 
23a90 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c     xJump(pParse,
23aa0 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
23ab0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
23ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 70 72 58  }else{.    exprX
23ad0 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f  .flags |= EP_Fro
23ae0 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74  mJoin;.    sqlit
23af0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
23b00 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
23b10 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20  d, dest);.  }.  
23b20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
23b30 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
23b40 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
23b50 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
23b60 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
23b70 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
23b80 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
23b90 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
23ba0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
23bb0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
23bc0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
23bd0 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
23be0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
23bf0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
23c00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
23c10 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
23c20 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
23c30 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
23c40 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
23c50 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
23c60 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
23c70 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
23c80 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
23c90 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23ca0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
23cb0 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
23cc0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
23cd0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
23ce0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
23cf0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23d00 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
23d10 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
23d20 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
23d30 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
23d40 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
23d50 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
23d60 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
23d70 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
23d80 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
23d90 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
23da0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
23db0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
23dc0 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a  se( xJump==0 );.
23dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
23de0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
23df0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
23e00 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
23e10 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
23e20 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
23e30 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
23e40 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
23e50 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
23e60 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
23e70 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
23e80 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
23e90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
23ea0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
23eb0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
23ec0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
23ed0 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
23ee0 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
23ef0 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
23f00 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
23f10 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
23f20 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
23f30 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
23f40 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
23f50 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
23f60 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
23f70 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
23f80 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
23f90 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
23fa0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
23fb0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
23fc0 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
23fd0 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
23fe0 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
23ff0 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
24000 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
24010 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
24020 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
24030 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
24040 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
24050 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
24060 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
24070 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
24080 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24090 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
240a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
240b0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
240c0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
240d0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
240e0 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
240f0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
24100 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
24110 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
24120 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
24130 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
24140 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
24150 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
24160 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
24170 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
24180 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
24190 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
241a0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
241b0 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
241c0 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
241d0 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
241e0 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
241f0 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
24200 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
24210 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
24220 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
24230 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
24240 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
24250 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
24260 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
24270 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
24280 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
24290 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
242a0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
242b0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
242c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
242d0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
242e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
242f0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
24300 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
24310 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
24320 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24330 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
24340 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
24350 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
24360 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
24370 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24380 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
24390 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
243a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
243b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
243c0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
243d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
243e0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
243f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24400 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
24410 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
24420 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
24430 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
24440 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
24450 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
24460 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
24470 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
24480 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24490 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
244a0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
244b0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
244c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
244d0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
244e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
244f0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
24500 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
24510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
24520 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
24530 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
24540 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
24550 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
24560 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
24570 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
24580 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
24590 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
245a0 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
245b0 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
245c0 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
245d0 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
245e0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
245f0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
24600 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
24610 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
24620 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
24630 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
24640 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
24650 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
24660 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
24670 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
24680 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
24690 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
246a0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
246b0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
246c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
246d0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
246e0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
246f0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
24700 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
24710 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
24720 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
24730 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24740 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
24750 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
24760 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
24770 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
24780 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
24790 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
247a0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
247b0 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
247c0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
247d0 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
247e0 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
247f0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
24800 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
24810 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
24820 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24830 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
24840 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
24850 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
24860 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
24870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
24880 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
24890 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
248a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
248b0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
248c0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
248d0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
248e0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
248f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
24900 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
24910 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  q && jumpIfNull=
24920 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
24930 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
24940 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
24950 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
24960 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
24970 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
24980 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
24990 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
249a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
249b0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
249c0 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
249d0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
249e0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
249f0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
24a00 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
24a10 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
24a20 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
24a30 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
24a40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
24a50 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
24a60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
24a70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
24a80 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
24a90 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
24aa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
24ab0 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
24ac0 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73  ull );   testcas
24ad0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
24ae0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
24af0 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
24b00 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74  _NotNull ); test
24b10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
24b20 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
24b30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24b40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
24b50 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
24b60 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
24b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24b80 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
24b90 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
24ba0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
24bb0 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
24bc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24bd0 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
24be0 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
24bf0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
24c00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
24c10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
24c20 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
24c30 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
24c40 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
24c50 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
24c60 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
24c70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33  r, dest, sqlite3
24c80 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70  ExprIfTrue, jump
24c90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
24ca0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
24cb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24cc0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
24cd0 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
24ce0 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
24cf0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
24d00 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
24d10 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
24d20 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20   = jumpIfNull ? 
24d30 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c  dest : destIfFal
24d40 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se;.      sqlite
24d50 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
24d60 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
24d70 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
24d80 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
24d90 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
24da0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
24db0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
24dc0 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
24dd0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
24de0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
24df0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
24e00 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20   default_expr:. 
24e10 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
24e20 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
24e30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24e40 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
24e50 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
24e60 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
24e70 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
24e80 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a        /* No-op *
24e90 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
24ea0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
24eb0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
24ec0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
24ed0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
24ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24ef0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
24f00 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
24f10 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
24f20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
24f30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
24f40 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
24f50 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
24f60 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
24f70 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
24f80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24f90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
24fa0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24fb0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
24fc0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
24fd0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
24fe0 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a  regFree2);  .}..
24ff0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
25000 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
25010 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
25020 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
25030 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
25040 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
25050 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
25060 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
25070 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
25080 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
25090 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
250a0 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
250b0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
250c0 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
250d0 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
250e0 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
250f0 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
25100 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c  umpIfNull is SQL
25110 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f  ITE_JUMPIFNULL o
25120 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
25130 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20  f jumpIfNull.** 
25140 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  is 0..*/.void sq
25150 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25160 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
25170 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
25180 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
25190 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
251a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
251b0 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
251c0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
251d0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
251e0 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
251f0 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
25200 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
25210 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
25220 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
25230 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
25240 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
25250 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
25260 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
25270 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
25280 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65  pExpr==0 )    re
25290 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
252a0 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
252b0 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
252c0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
252d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
252e0 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
252f0 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
25300 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
25310 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
25320 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
25330 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
25340 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
25350 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
25360 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
25370 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
25380 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
25390 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
253a0 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
253b0 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
253c0 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
253d0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
253e0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
25400 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
25410 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
25420 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
25430 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
25440 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
25450 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
25460 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
25470 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
25480 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
25490 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
254a0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
254b0 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
254c0 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
254d0 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
254e0 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
254f0 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
25500 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
25510 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
25520 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
25530 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
25540 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
25550 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
25560 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
25570 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
25580 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
25590 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
255a0 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
255b0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
255c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
255d0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
255e0 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
255f0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
25600 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
25610 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
25620 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
25630 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
25640 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
25650 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
25660 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
25670 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
25680 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
25690 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
256a0 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
256b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
256c0 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
256d0 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
256e0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
256f0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
25700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
25710 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
25720 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
25730 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
25740 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
25750 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65  _AND: {.      te
25760 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25770 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
25780 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25790 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
257a0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
257b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
257c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
257d0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
257e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
257f0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
25800 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
25810 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25820 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25830 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
25840 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
25850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
25860 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
25870 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
25880 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
25890 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
258a0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
258b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
258c0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
258d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
258e0 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
258f0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
25900 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
25910 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
25920 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
25930 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25940 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25950 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
25960 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
25970 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
25980 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
25990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
259a0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
259b0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
259c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
259d0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
259e0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
259f0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
25a00 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25a10 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
25a20 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
25a30 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
25a40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
25a50 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
25a60 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
25a70 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
25a80 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
25a90 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
25aa0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
25ab0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
25ac0 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e     op = (pExpr->
25ad0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
25ae0 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20  NE : TK_EQ;.    
25af0 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53    jumpIfNull = S
25b00 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
25b10 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
25b20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
25b30 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
25b40 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
25b50 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
25b60 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
25b70 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
25b80 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
25b90 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
25ba0 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  tor(pExpr->pLeft
25bb0 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74  ) ) goto default
25bc0 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73  _expr;.      tes
25bd0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25be0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
25bf0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
25c00 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
25c10 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
25c20 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
25c30 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
25c40 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
25c50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
25c60 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
25c70 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
25c80 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
25c90 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
25ca0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
25cb0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
25cc0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25cd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
25ce0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
25cf0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
25d00 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
25d10 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
25d20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
25d30 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
25d40 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
25d50 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
25d60 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
25d70 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
25d80 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
25d90 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
25da0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25db0 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
25dc0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
25dd0 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
25de0 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
25df0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
25e00 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
25e10 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
25e20 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
25e30 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
25e40 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25e50 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
25e60 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
25e70 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
25e80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
25e90 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
25ea0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
25eb0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
25ec0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
25ed0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
25ee0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
25ef0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
25f00 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
25f10 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
25f20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
25f30 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
25f40 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
25f50 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
25f60 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
25f70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25f80 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
25f90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25fa0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
25fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25fc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
25fd0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
25fe0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
25ff0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
26000 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
26010 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26020 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
26030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26040 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
26050 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
26060 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
26070 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43  SNULL );   VdbeC
26080 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26090 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
260a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
260b0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20  =TK_NOTNULL );  
260c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
260d0 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
260e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
260f0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
26100 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
26110 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
26120 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
26130 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26140 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26150 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
26160 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
26170 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45  , dest, sqlite3E
26180 78 70 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70  xprIfFalse, jump
26190 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
261a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
261b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
261c0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
261d0 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
261e0 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   if( jumpIfNull 
261f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26200 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
26210 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
26220 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
26230 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
26240 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
26250 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26260 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
26270 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
26280 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
26290 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
262a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
262b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
262c0 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
262d0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
262e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
262f0 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
26300 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
26310 5f 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66  _expr: .      if
26320 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
26330 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
26340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
26350 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
26360 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
26370 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
26380 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
26390 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
263a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
263b0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
263c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
263d0 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
263e0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
263f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
26400 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
26410 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
26420 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
26430 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
26440 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26450 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26460 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26470 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26490 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
264a0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
264b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
264c0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
264d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
264e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
264f0 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
26500 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
26510 49 66 46 61 6c 73 65 28 29 20 65 78 63 65 70 74  IfFalse() except
26520 20 74 68 61 74 20 61 20 63 6f 70 79 20 69 73 20   that a copy is 
26530 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20 62 65  made of pExpr be
26540 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e  fore.** code gen
26550 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61  eration, and tha
26560 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65  t copy is delete
26570 64 20 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e  d after code gen
26580 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a  eration. This.**
26590 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
265a0 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72  e original pExpr
265b0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
265c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
265d0 70 72 49 66 46 61 6c 73 65 44 75 70 28 50 61 72  prIfFalseDup(Par
265e0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
265f0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
26600 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  t,int jumpIfNull
26610 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
26620 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
26630 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73   Expr *pCopy = s
26640 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
26650 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
26660 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
26670 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  led==0 ){.    sq
26680 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26690 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20  (pParse, pCopy, 
266a0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
266b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
266c0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
266d0 43 6f 70 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Copy);.}.../*.**
266e0 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
266f0 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
26700 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
26710 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
26720 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
26730 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
26740 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
26750 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
26760 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
26770 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
26780 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
26790 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
267a0 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
267b0 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
267c0 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
267d0 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
267e0 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
267f0 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
26800 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
26810 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
26820 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
26830 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
26840 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
26850 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
26860 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
26870 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
26880 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74  he pA side might
26890 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47   be using TK_REG
268a0 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20  ISTER.  If that 
268b0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
268c0 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69  pB is.** not usi
268d0 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62  ng TK_REGISTER b
268e0 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
268f0 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e  equivalent, then
26900 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e   still return 0.
26910 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
26920 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
26930 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
26940 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
26950 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
26960 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
26970 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
26980 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
26990 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
269a0 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
269b0 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
269c0 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
269d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
269e0 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
269f0 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
26a00 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
26a10 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
26a20 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
26a30 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
26a40 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
26a50 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
26a60 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
26a70 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
26a80 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
26a90 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
26aa0 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
26ab0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
26ac0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
26ad0 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
26ae0 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
26af0 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
26b00 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
26b10 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
26b20 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
26b30 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
26b40 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
26b50 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
26b60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
26b70 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
26b80 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69  *pA, Expr *pB, i
26b90 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20  nt iTab){.  u32 
26ba0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20  combinedFlags;. 
26bb0 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
26bc0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
26bd0 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32  n pB==pA ? 0 : 2
26be0 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64  ;.  }.  combined
26bf0 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67  Flags = pA->flag
26c00 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20  s | pB->flags;. 
26c10 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
26c20 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
26c30 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d   ){.    if( (pA-
26c40 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73  >flags&pB->flags
26c50 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30  &EP_IntValue)!=0
26c60 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   && pA->u.iValue
26c70 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  ==pB->u.iValue )
26c80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
26c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
26ca0 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
26cb0 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
26cc0 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
26cd0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
26ce0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
26cf0 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
26d00 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
26d10 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
26d20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f   }.    if( pB->o
26d30 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
26d40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
26d50 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66  are(pA, pB->pLef
26d60 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  t, iTab)<2 ){.  
26d70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26d80 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
26d90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
26da0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
26db0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f   pA->op!=TK_AGG_
26dc0 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
26dd0 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
26de0 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  ( pA->op==TK_FUN
26df0 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69  CTION ){.      i
26e00 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
26e10 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
26e20 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
26e30 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
26e40 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
26e50 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
26e60 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
26e70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
26e80 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
26e90 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d  E ? 1 : 2;.    }
26ea0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
26eb0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
26ec0 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
26ed0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
26ee0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
26ef0 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
26f00 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b  edFlags & EP_Tok
26f10 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20  enOnly)==0) ){. 
26f20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46     if( combinedF
26f30 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
26f40 65 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ect ) return 2;.
26f50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
26f60 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
26f70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
26f80 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
26f90 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
26fa0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
26fb0 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
26fc0 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65  ight, iTab) ) re
26fd0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
26fe0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
26ff0 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69  ompare(pA->x.pLi
27000 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c  st, pB->x.pList,
27010 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
27020 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  2;.    if( ALWAY
27030 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
27040 20 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d   & EP_Reduced)==
27050 30 29 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  0) && pA->op!=TK
27060 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20  _STRING ){.     
27070 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e   if( pA->iColumn
27080 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
27090 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
270a0 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
270b0 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20  pB->iTable .    
270c0 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c     && (pA->iTabl
270d0 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52  e!=iTab || NEVER
270e0 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29  (pB->iTable>=0))
270f0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
27100 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
27110 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0;.}../*.** Comp
27120 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  are two ExprList
27130 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72   objects.  Retur
27140 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  n 0 if they are 
27150 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a  identical and .*
27160 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
27170 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
27180 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   way..**.** If a
27190 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
271a0 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
271b0 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
271c0 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
271d0 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
271e0 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
271f0 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
27200 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
27210 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
27220 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
27230 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
27240 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20   for equivalent 
27250 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a  ExprLists.  The.
27260 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65  ** only conseque
27270 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61  nce will be disa
27280 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f  bled optimizatio
27290 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  ns.  But this ro
272a0 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65  utine.** must ne
272b0 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20  ver return 0 if 
272c0 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  the two ExprList
272d0 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66   objects are dif
272e0 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20  ferent, or.** a 
272f0 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  malfunction will
27300 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54   result..**.** T
27310 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73  wo NULL pointers
27320 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
27330 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20  to be the same. 
27340 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   But a NULL poin
27350 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69  ter.** always di
27360 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e  ffers from a non
27370 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a  -NULL pointer..*
27380 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
27390 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70  rListCompare(Exp
273a0 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c  rList *pA, ExprL
273b0 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  ist *pB, int iTa
273c0 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
273d0 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d  f( pA==0 && pB==
273e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
273f0 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
27400 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
27410 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d   if( pA->nExpr!=
27420 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  pB->nExpr ) retu
27430 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 1;.  for(i=0;
27440 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b   i<pA->nExpr; i+
27450 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
27460 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e  xprA = pA->a[i].
27470 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
27480 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b  *pExprB = pB->a[
27490 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
274a0 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  ( pA->a[i].sortO
274b0 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73  rder!=pB->a[i].s
274c0 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
274d0 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 1;.    if( sql
274e0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
274f0 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
27500 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
27510 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
27520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
27530 6e 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e  n true if we can
27540 20 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77   prove the pE2 w
27550 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72  ill always be tr
27560 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20  ue if pE1 is.** 
27570 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
27580 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  lse if we cannot
27590 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72   complete the pr
275a0 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69  oof or if pE2 mi
275b0 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e  ght.** be false.
275c0 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
275d0 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20  *     pE1: x==5 
275e0 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
275f0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
27600 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
27610 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20  pE1: x>0        
27620 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
27630 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61        Result: fa
27640 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
27650 78 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20  x=21       pE2: 
27660 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20  x=21 OR y=43    
27670 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
27680 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33       pE1: x!=123
27690 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
276a0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
276b0 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
276c0 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70  E1: x!=?1      p
276d0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
276e0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
276f0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
27700 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20  IS NULL  pE2: x 
27710 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
27720 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
27730 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32      pE1: x IS ?2
27740 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
27750 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74  T NULL    Reuslt
27760 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68  : false.**.** Wh
27770 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f  en comparing TK_
27780 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74  COLUMN nodes bet
27790 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32  ween pE1 and pE2
277a0 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20  , if pE2 has.** 
277b0 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68  Expr.iTable<0 th
277c0 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c  en assume a tabl
277d0 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62  e number given b
277e0 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68  y iTab..**.** Wh
277f0 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
27800 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75  urn false.  Retu
27810 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74  rning true might
27820 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
27830 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65  nce.** improveme
27840 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  nt.  Returning f
27850 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65  alse might cause
27860 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72   a performance r
27870 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  eduction, but.**
27880 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   it will always 
27890 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  give the correct
278a0 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68   answer and is h
278b0 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65  ence always safe
278c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
278d0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
278e0 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20  Expr *pE1, Expr 
278f0 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b  *pE2, int iTab){
27900 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
27910 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70  prCompare(pE1, p
27920 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a  E2, iTab)==0 ){.
27930 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
27940 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
27950 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71  =TK_OR.   && (sq
27960 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
27970 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70  Expr(pE1, pE2->p
27980 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
27990 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
279a0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
279b0 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69  pr(pE1, pE2->pRi
279c0 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29  ght, iTab) ).  )
279d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
279e0 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
279f0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
27a00 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
27a10 6f 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66  ompare(pE1->pLef
27a20 74 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  t, pE2->pLeft, i
27a30 54 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70  Tab)==0.   && (p
27a40 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  E1->op!=TK_ISNUL
27a50 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
27a60 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  _IS).  ){.    re
27a70 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
27a80 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
27a90 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
27aa0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
27ab0 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
27ac0 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
27ad0 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  er.** to determi
27ae0 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73 73  ne if an express
27af0 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75  ion can be evalu
27b00 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ated by referenc
27b10 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65  e to the.** inde
27b20 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20  x only, without 
27b30 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73  having to do a s
27b40 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f  earch for the co
27b50 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
27b60 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65  able entry.  The
27b70 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66   IdxCover.pIdx f
27b80 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65  ield is the inde
27b90 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75  x.  IdxCover.iCu
27ba0 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73  r.** is the curs
27bb0 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
27bc0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43  ..*/.struct IdxC
27bd0 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a  over {.  Index *
27be0 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65  pIdx;     /* The
27bf0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73   index to be tes
27c00 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  ted for coverage
27c10 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
27c20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
27c30 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
27c40 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
27c50 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
27c60 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   */.};../*.** Ch
27c70 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
27c80 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e 63  ere are referenc
27c90 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
27ca0 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b   table .** pWalk
27cb0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
27cc0 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61 74  >iCur can be sat
27cd0 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68 65  isfied using the
27ce0 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65   index.** pWalke
27cf0 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
27d00 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
27d10 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65 72  int exprIdxCover
27d20 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
27d30 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
27d40 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
27d50 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
27d60 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
27d70 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
27d80 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26  over->iCur.   &&
27d90 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
27da0 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75  Index(pWalker->u
27db0 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
27dc0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
27dd0 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61  )<0.  ){.    pWa
27de0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
27df0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
27e00 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Abort;.  }.  ret
27e10 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
27e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
27e30 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78  mine if an index
27e40 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77   pIdx on table w
27e50 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 20  ith cursor iCur 
27e60 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a  contains will.**
27e70 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27e80 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74  pExpr.  Return t
27e90 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65 78  rue if the index
27ea0 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a   does cover the.
27eb0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
27ec0 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70  d false if the p
27ed0 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
27ee0 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65  references table
27ef0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74   columns.** that
27f00 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69   are not found i
27f10 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  n the index pIdx
27f20 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78  ..**.** An index
27f30 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70   covering an exp
27f40 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68  ression means th
27f50 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
27f60 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c  n can be.** eval
27f70 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79  uated using only
27f80 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77   the index and w
27f90 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
27fa0 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63   lookup the.** c
27fb0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
27fc0 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74  le entry..*/.int
27fd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65   sqlite3ExprCove
27fe0 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78  redByIndex(.  Ex
27ff0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
28000 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
28010 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20  o be tested */. 
28020 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
28030 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
28040 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
28050 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
28060 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78  table */.  Index
28070 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
28080 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74  * The index that
28090 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 66   might be used f
280a0 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29  or coverage */.)
280b0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
280c0 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
280d0 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26  xcov;.  memset(&
280e0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
280f0 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20  ;.  xcov.iCur = 
28100 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64  iCur;.  xcov.pId
28110 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45  x = pIdx;.  w.xE
28120 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
28130 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e  prIdxCover;.  w.
28140 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78  u.pIdxCover = &x
28150 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  cov;.  sqlite3Wa
28160 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
28170 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65  );.  return !w.e
28180 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Code;.}.../*.** 
28190 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
281a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
281b0 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
281c0 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
281d0 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65  r.** to count re
281e0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
281f0 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
28200 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e   arguments of an
28210 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66   .** aggregate f
28220 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65  unction, in orde
28230 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  r to implement t
28240 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  he.** sqlite3Fun
28250 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72  ctionThisSrc() r
28260 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
28270 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53  t SrcCount {.  S
28280 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
28290 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61  /* One particula
282a0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  r FROM clause in
282b0 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20   a nested query 
282c0 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20  */.  int nThis; 
282d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
282e0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
282f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63   columns in pSrc
28300 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  List */.  int nO
28310 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ther;      /* Nu
28320 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
28330 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
28340 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
28350 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
28360 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
28370 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
28380 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  to columns..*/.s
28390 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72  tatic int exprSr
283a0 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70  cCount(Walker *p
283b0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
283c0 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e  xpr){.  /* The N
283d0 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65  EVER() on the se
283e0 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63  cond term is bec
283f0 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63  ause sqlite3Func
28400 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
28410 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  ).  ** is always
28420 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73   called before s
28430 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
28440 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e  eAggregates() an
28450 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b  d so the.  ** TK
28460 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f  _COLUMNs have no
28470 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65  t yet been conve
28480 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47  rted into TK_AGG
28490 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a  _COLUMN.  If.  *
284a0 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
284b0 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69  nUsesThisSrc() i
284c0 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74  s used different
284d0 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  ly in the future
284e0 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52  , the.  ** NEVER
284f0 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  () will need to 
28500 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20  be removed. */. 
28510 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
28520 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56  TK_COLUMN || NEV
28530 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ER(pExpr->op==TK
28540 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a  _AGG_COLUMN) ){.
28550 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
28560 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a  truct SrcCount *
28570 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
28580 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72  SrcCount;.    Sr
28590 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
285a0 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  >pSrc;.    int n
285b0 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72  Src = pSrc ? pSr
285c0 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20  c->nSrc : 0;.   
285d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63   for(i=0; i<nSrc
285e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
285f0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
28600 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  =pSrc->a[i].iCur
28610 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
28620 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72   }.    if( i<nSr
28630 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54  c ){.      p->nT
28640 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  his++;.    }else
28650 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65  {.      p->nOthe
28660 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  r++;.    }.  }. 
28670 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28680 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  inue;.}../*.** D
28690 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20  etermine if any 
286a0 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  of the arguments
286b0 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75   to the pExpr Fu
286c0 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  nction reference
286d0 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52  .** pSrcList.  R
286e0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
286f0 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74  ey do.  Also ret
28700 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
28710 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
28720 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20  no arguments or 
28730 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e  has only constan
28740 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
28750 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45  turn false if pE
28760 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  xpr.** reference
28770 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f  s columns but no
28780 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62  t columns of tab
28790 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72  les found in pSr
287a0 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cList..*/.int sq
287b0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
287c0 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70  sThisSrc(Expr *p
287d0 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70  Expr, SrcList *p
287e0 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b  SrcList){.  Walk
287f0 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53  er w;.  struct S
28800 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61  rcCount cnt;.  a
28810 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
28820 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
28830 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  N );.  memset(&w
28840 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
28850 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
28860 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e  ck = exprSrcCoun
28870 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  t;.  w.u.pSrcCou
28880 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
28890 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
288a0 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
288b0 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
288c0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
288d0 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
288e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
288f0 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
28900 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
28910 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
28920 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
28930 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
28940 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
28950 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
28960 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
28970 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
28980 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
28990 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
289a0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
289b0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
289c0 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
289d0 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
289e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
289f0 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
28a00 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
28a10 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
28a20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
28a30 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
28a40 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
28a50 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
28a60 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
28a70 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
28a80 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
28a90 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
28aa0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
28ab0 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
28ac0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
28ad0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
28ae0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
28af0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
28b00 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
28b10 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
28b20 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
28b30 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
28b40 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
28b50 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
28b60 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
28b70 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
28b80 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
28b90 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
28ba0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
28bb0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
28bc0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
28bd0 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
28be0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
28bf0 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
28c00 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
28c10 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
28c20 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
28c30 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
28c40 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
28c50 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
28c60 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
28c70 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
28c80 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
28c90 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
28ca0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
28cb0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
28cc0 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
28cd0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
28ce0 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
28cf0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
28d00 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
28d10 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
28d20 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
28d30 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
28d40 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
28d50 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
28d60 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
28d70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
28d80 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
28d90 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
28da0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
28db0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
28dc0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
28dd0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
28de0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
28df0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28e00 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
28e10 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
28e20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
28e30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
28e40 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
28e50 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
28e60 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
28e70 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
28e80 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
28e90 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
28ea0 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
28eb0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
28ec0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
28ed0 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
28ee0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
28ef0 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
28f00 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
28f10 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
28f20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
28f30 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
28f40 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
28f50 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
28f60 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
28f70 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
28f80 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
28f90 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
28fa0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
28fb0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
28fc0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
28fd0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
28fe0 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
28ff0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
29000 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
29010 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
29020 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
29030 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
29040 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29050 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
29060 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
29070 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
29080 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
29090 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
290a0 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
290b0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
290c0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
290d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
290e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
290f0 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
29100 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
29110 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
29120 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
29130 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
29140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
29150 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
29160 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
29180 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
29190 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
291a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
291c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
291d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
291e0 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
291f0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
29200 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
29210 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
29220 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
29230 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
29240 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
29250 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
29260 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
29270 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
29280 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
29290 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
292a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
292b0 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
292c0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
292d0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
292e0 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
292f0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
29300 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
29310 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
29320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29330 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
29340 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
29350 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
29360 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
29370 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29380 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
29390 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
293a0 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
293c0 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
293d0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
293e0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
293f0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
29400 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
29410 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
29420 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
29430 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
29440 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
29450 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
29460 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
29470 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
29480 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
29490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
294a0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
294b0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
294c0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
294d0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
294f0 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
29500 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
29530 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
29550 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
29560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29570 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29580 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29590 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
295a0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
295b0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
295c0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
295d0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
295e0 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
295f0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
29600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29620 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
29630 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
29640 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
29650 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
29660 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
29670 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
29680 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
29690 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
296a0 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
296b0 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
296c0 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
296d0 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
296e0 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
296f0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
29700 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
29710 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
29720 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
29730 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
29740 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
29750 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
29760 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
29770 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
29780 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
29790 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
297a0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
297b0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
297c0 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b  ->iAgg = (i16)k;
297d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
297e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
297f0 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
29800 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
29810 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
29820 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
29830 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
29840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
29850 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
29860 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
29870 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
29880 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e   {.      if( (pN
29890 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
298a0 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20  InAggFunc)==0.  
298b0 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d       && pWalker-
298c0 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45  >walkerDepth==pE
298d0 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29  xpr->op2.      )
298e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
298f0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
29900 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
29910 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
29920 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
29930 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
29940 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
29950 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
29960 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
29970 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
29980 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
29990 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
299a0 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
299b0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
299c0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
299d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
299e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
299f0 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
29a00 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20  ->pExpr, pExpr, 
29a10 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
29a20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29a30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29a40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
29a50 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
29a60 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
29a70 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
29a80 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
29a90 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
29aa0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
29ab0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29ac0 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
29ad0 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
29ae0 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
29af0 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
29b00 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
29b10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
29b20 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
29b30 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
29b40 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
29b50 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
29b60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
29b70 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
29b80 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
29b90 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
29ba0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
29bb0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
29bc0 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
29bd0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
29be0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
29bf0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
29c00 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
29c10 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
29c20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
29c30 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
29c40 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
29c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c60 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
29c70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  en, .           
29c80 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
29c90 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
29ca0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
29cb0 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
29cc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
29cd0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
29ce0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
29cf0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
29d00 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
29d10 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
29d20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
29d40 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
29d50 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
29d60 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
29d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29d80 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
29d90 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
29da0 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
29db0 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
29dc0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29dd0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
29de0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
29df0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
29e00 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
29e10 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
29e20 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
29e30 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
29e40 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
29e50 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20  g = (i16)i;.    
29e60 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
29e70 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
29e80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
29e90 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
29ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
29eb0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
29ec0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
29ed0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
29ee0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
29ef0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
29f00 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
29f10 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
29f20 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
29f30 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
29f40 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65  PARAMETER(pWalke
29f50 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  r);.  UNUSED_PAR
29f60 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
29f70 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
29f80 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
29f90 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78   Analyze the pEx
29fa0 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  pr expression lo
29fb0 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
29fc0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
29fd0 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
29fe0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
29ff0 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49  be added to AggI
2a000 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20  nfo object that 
2a010 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a  pNC->pAggInfo.**
2a020 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64   points to.  Add
2a030 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20  itional entries 
2a040 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20  are made on the 
2a050 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61  AggInfo object a
2a060 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a  s.** necessary..
2a070 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2a080 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
2a090 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
2a0a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
2a0b0 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
2a0c0 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73  ed by sqlite3Res
2a0d0 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e  olveExprNames().
2a0e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a0f0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2a100 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
2a110 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
2a120 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
2a130 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
2a140 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
2a150 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2a160 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2a170 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
2a180 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2a190 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2a1a0 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  ect;.  w.u.pNC =
2a1b0 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
2a1c0 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
2a1d0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
2a1e0 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
2a1f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
2a200 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2a210 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
2a220 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
2a230 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
2a240 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
2a250 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
2a260 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
2a270 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
2a280 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
2a290 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
2a2a0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
2a2b0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2a2c0 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
2a2d0 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
2a2e0 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
2a2f0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2a300 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
2a310 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
2a320 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
2a330 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
2a340 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
2a350 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2a360 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2a370 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
2a380 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
2a390 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2a3a0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2a3b0 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
2a3c0 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
2a3d0 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
2a3e0 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
2a3f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
2a400 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2a410 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
2a420 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
2a430 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2a440 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
2a460 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
2a470 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2a480 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
2a490 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
2a4a0 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
2a4b0 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
2a4c0 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
2a4d0 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  purpose..**.** I
2a4e0 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
2a4f0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
2a500 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75  used by the colu
2a510 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a  mn cache, then.*
2a520 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69  * the deallocati
2a530 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75  on is deferred u
2a540 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ntil the column 
2a550 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20  cache line that 
2a560 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  uses.** the regi
2a570 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61  ster becomes sta
2a580 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
2a590 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2a5a0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
2a5b0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
2a5c0 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
2a5d0 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
2a5e0 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
2a5f0 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e  mpReg) ){.    in
2a600 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
2a610 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
2a620 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
2a630 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
2a640 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
2a650 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
2a660 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65        if( p->iRe
2a670 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
2a680 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
2a690 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2a6a0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
2a6b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
2a6c0 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
2a6d0 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
2a6e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2a6f0 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
2a700 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
2a710 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
2a720 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69  e registers.*/.i
2a730 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2a740 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2a750 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2a760 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2a770 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
2a780 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
2a790 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
2a7a0 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
2a7b0 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65      assert( !use
2a7c0 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
2a7d0 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
2a7e0 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
2a7f0 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
2a800 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
2a810 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
2a820 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2a830 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2a840 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
2a850 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
2a860 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
2a870 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
2a880 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
2a890 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2a8a0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
2a8b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2a8c0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
2a8d0 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20   iReg, nReg);.  
2a8e0 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d  if( nReg>pParse-
2a8f0 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
2a900 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2a910 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  Reg = nReg;.    
2a920 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2a930 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  g = iReg;.  }.}.
2a940 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20  ./*.** Mark all 
2a950 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
2a960 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61  ers as being una
2a970 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
2a980 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
2a990 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2a9a0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
2a9b0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  se){.  pParse->n
2a9c0 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  TempReg = 0;.  p
2a9d0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2a9e0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56   = 0;.}../*.** V
2a9f0 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20  alidate that no 
2aa00 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
2aa10 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20  er falls within 
2aa20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20  the range of.** 
2aa30 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69  iFirst..iLast, i
2aa40 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20  nclusive.  This 
2aa50 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
2aa60 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e  call from within
2aa70 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
2aa80 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64  tements..*/.#ifd
2aa90 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2aaa0 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d  int sqlite3NoTem
2aab0 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20  psInRange(Parse 
2aac0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69  *pParse, int iFi
2aad0 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b  rst, int iLast){
2aae0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2aaf0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2ab00 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73 65  g>0.   && pParse
2ab10 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72  ->iRangeReg+pPar
2ab20 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3c 69 4c  se->nRangeReg<iL
2ab30 61 73 74 0a 20 20 20 26 26 20 70 50 61 72 73 65  ast.   && pParse
2ab40 2d 3e 69 52 61 6e 67 65 52 65 67 3e 3d 69 46 69  ->iRangeReg>=iFi
2ab50 72 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65  rst.  ){.     re
2ab60 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
2ab70 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
2ab80 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b  >nTempReg; i++){
2ab90 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
2aba0 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46  >aTempReg[i]>=iF
2abb0 69 72 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e  irst && pParse->
2abc0 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61  aTempReg[i]<=iLa
2abd0 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
2abe0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
2abf0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2ac00 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
2ac10 45 42 55 47 20 2a 2f 0a                          EBUG */.