/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 82fedd57c8ce9e7dc16a003ad4cd863308787d5b5cbd0f83263b37805a56319c:


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 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0fd0: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0fe0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0ff0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1000: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
1010: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
1020: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
1030: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1040: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
1050: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
1060: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
1070: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
1080: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
1090: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
10a0: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
10b0: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
10c0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
10d0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
10e0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
10f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1100: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1110: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
1120: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
1130: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1140: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1150: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1160: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1170: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1180: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1190: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
11a0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
11b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
11c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
11d0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
11e0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
11f0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
1200: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
1210: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
1220: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
1230: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1240: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1260: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1270: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1280: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1290: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
12a0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
12b0: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
12c0: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
12d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
12e0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
12f0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
1300: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
1310: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
1320: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1330: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1340: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1350: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1360: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1370: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1380: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1390: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
13a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
13b0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
13c0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
13d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
13e0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
13f0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
1400: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1420: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1430: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1440: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1450: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1460: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1470: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1480: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1490: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14a0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
14b0: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
14c0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
14d0: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
14e0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
14f0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
1500: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
1510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1520: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
1530: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1540: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1550: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1560: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1570: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1580: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1590: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
15a0: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
15b0: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
15c0: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
15d0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
15e0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
15f0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
1600: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
1610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
1620: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
1630: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1640: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1650: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1660: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1670: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1680: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1690: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
16a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
16b0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
16c0: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
16d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
16e0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
16f0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
1700: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
1710: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
1720: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1750: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1760: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1790: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
17a0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
17b0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
17c0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
17d0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
17e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
17f0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
1800: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1810: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
1820: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1830: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1840: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1850: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1860: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1870: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1880: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1890: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
18a0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
18b0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
18c0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
18d0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
18e0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
18f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1900: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
1910: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
1920: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
1930: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1940: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1950: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1960: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1970: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1980: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1990: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
19a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19b0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
19c0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
19d0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
19e0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
19f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a00: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1a30: 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BLOB;.    }.  }
1a40: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1a50: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1a60: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1a70: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1a80: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1a90: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1aa0: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1ab0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1ac0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1ad0: 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BLOB;.  }else{.
1ae0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
1af0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
1b00: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
1b10: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
1b20: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
1b30: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1b40: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1b50: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1b60: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1b70: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1b80: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1b90: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1ba0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1bb0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1bc0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1bd0: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1be0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1bf0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1c00: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1c10: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1c20: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1c30: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1c40: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1c50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1c60: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1c70: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1c80: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1c90: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1ca0: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1cb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1cd0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ce0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1cf0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1d00: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1d10: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1d20: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1d30: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1d40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1d50: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1d60: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1d70: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1d80: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1d90: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1da0: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1db0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1dc0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1dd0: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1de0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1df0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1e00: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1e10: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1e20: 65 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20  else if( aff==0 
1e30: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
1e40: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
1e50: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1e70: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
1e80: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
1e90: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
1ea0: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
1eb0: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
1ec0: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
1ed0: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1ee0: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1ef0: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1f00: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1f10: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1f20: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1f30: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1f40: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
1f50: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1f60: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
1f70: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
1f80: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
1f90: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
1fa0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
1fb0: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
1fc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1fd0: 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  AFF_BLOB:.      
1fe0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1ff0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
2000: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
2010: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
2020: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
2030: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2040: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2050: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
2060: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
2070: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2080: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
2090: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
20a0: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
20b0: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
20c0: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
20d0: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
20e0: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
20f0: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
2100: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
2110: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
2120: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
2130: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
2140: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
2150: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
2160: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2170: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
2180: 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61  (u8)sqlite3Compa
2190: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
21a0: 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75  1, aff) | (u8)ju
21b0: 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75  mpIfNull;.  retu
21c0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
21d0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
21e0: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
21f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
2200: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2210: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
2220: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2230: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
2240: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
2250: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
2260: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
2270: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
2280: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
2290: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
22a0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
22b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
22c0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
22d0: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
22e0: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
22f0: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
2300: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
2310: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
2320: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
2330: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
2340: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
2350: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
2360: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
2370: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
2380: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
2390: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
23a0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
23b0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
23c0: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
23d0: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
23e0: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
23f0: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
2400: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
2410: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
2420: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
2430: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
2440: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2450: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2460: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
2470: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
2480: 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61   && (pRight->fla
2490: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
24a0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  !=0 ){.    pColl
24b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24c0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52  llSeq(pParse, pR
24d0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
24e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
24f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2500: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2510: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2520: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
2530: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2540: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
2550: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2560: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
2570: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
2580: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
2590: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
25a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
25b0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
25c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
25d0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
25e0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
25f0: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
2600: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2610: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
2620: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2630: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
2640: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
2650: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
2660: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
2670: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
2680: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
2690: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
26a0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
26b0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
26c0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
26d0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
26e0: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
26f0: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
2700: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
2710: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
2720: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
2730: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
2740: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
2750: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
2760: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
2770: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2780: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
2790: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
27a0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
27b0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
27d0: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
27e0: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
27f0: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
2800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
2820: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
2830: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
2840: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
2850: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
2860: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2880: 6e 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73  n true if expres
2890: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
28a0: 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65  vector, or false
28b0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
28c0: 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65  * A vector is de
28d0: 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70  fined as any exp
28e0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73  ression that res
28f0: 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d  ults in two or m
2900: 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f  ore.** columns o
2910: 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79  f result.  Every
2920: 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20   TK_VECTOR node 
2930: 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63  is an vector bec
2940: 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73  ause the.** pars
2950: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65  er will not gene
2960: 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52  rate a TK_VECTOR
2970: 20 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e   with fewer than
2980: 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a   two entries..**
2990: 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54   But a TK_SELECT
29a0: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
29b0: 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
29c0: 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c  calar. It is onl
29d0: 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  y.** considered 
29e0: 61 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68  a vector if it h
29f0: 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72  as two or more r
2a00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  esult columns..*
2a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a20: 72 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a  rIsVector(Expr *
2a30: 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e  pExpr){.  return
2a40: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2a50: 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b  orSize(pExpr)>1;
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
2a70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
2a80: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
2a90: 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79  rgument is of ty
2aa0: 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a  pe TK_VECTOR .**
2ab0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2ac0: 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  er of expression
2ad0: 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e  s in the vector.
2ae0: 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72   Or, if the expr
2af0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73  ession.** is a s
2b00: 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72  ub-select, retur
2b10: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2b20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
2b30: 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a  ub-select. For.*
2b40: 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65  * any other type
2b50: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   of expression, 
2b60: 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74  return 1..*/.int
2b70: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2b80: 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78  orSize(Expr *pEx
2b90: 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70  pr){.  u8 op = p
2ba0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
2bb0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
2bc0: 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  ) op = pExpr->op
2bd0: 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  2;.  if( op==TK_
2be0: 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65  VECTOR ){.    re
2bf0: 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c  turn pExpr->x.pL
2c00: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65  ist->nExpr;.  }e
2c10: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53  lse if( op==TK_S
2c20: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74  ELECT ){.    ret
2c30: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  urn pExpr->x.pSe
2c40: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
2c50: 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  xpr;.  }else{.  
2c60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2c80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
2c90: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  ubexpression of 
2ca0: 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20  pVector that is 
2cb0: 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75  the i-th.** colu
2cc0: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
2cd0: 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74   (numbered start
2ce0: 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68  ing with 0).  Th
2cf0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
2d00: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69   ensure that i i
2d10: 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a  s within range..
2d20: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
2d30: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
2d40: 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72  lar (and "scalar
2d50: 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20  " here includes 
2d60: 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68  subqueries.** th
2d70: 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  at return a sing
2d80: 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e  le column!) then
2d90: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20   return pVector 
2da0: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  unmodified..**.*
2db0: 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e  * pVector retain
2dc0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  s ownership of t
2dd0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65  he returned sube
2de0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2df0: 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69   If the vector i
2e00: 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  s a (SELECT ...)
2e10: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
2e20: 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73  sion returned is
2e30: 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70  .** just the exp
2e40: 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20  ression for the 
2e50: 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  i-th term of the
2e60: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
2e70: 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72   may.** not be r
2e80: 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74  eady for evaluat
2e90: 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ion because the 
2ea0: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73  table cursor has
2eb0: 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
2ec0: 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a   positioned..*/.
2ed0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63  Expr *sqlite3Vec
2ee0: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
2ef0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69  Expr *pVector, i
2f00: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
2f10: 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65   i<sqlite3ExprVe
2f20: 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72  ctorSize(pVector
2f30: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
2f40: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
2f50: 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61  Vector) ){.    a
2f60: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
2f70: 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f  op2==0 || pVecto
2f80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
2f90: 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ER );.    if( pV
2fa0: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  ector->op==TK_SE
2fb0: 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d  LECT || pVector-
2fc0: 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  >op2==TK_SELECT 
2fd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fe0: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65  pVector->x.pSele
2ff0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
3000: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
3010: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
3020: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3030: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
3040: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3050: 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   pVector;.}../*.
3060: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
3070: 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72  eturn a new Expr
3080: 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68   object which wh
3090: 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20  en passed to.** 
30a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
30b0: 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  ) will generate 
30c0: 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f  all necessary co
30d0: 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a  de to compute.**
30e0: 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63   the iField-th c
30f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
3100: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70  tor expression p
3110: 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  Vector..**.** It
3120: 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74   is ok for pVect
3130: 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  or to be a scala
3140: 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46  r (as long as iF
3150: 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49  ield==0).  .** I
3160: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
3170: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
3180: 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
3190: 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Dup()..**.** The
31a0: 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65   caller owns the
31b0: 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f   returned Expr o
31c0: 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73  bject and is res
31d0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  ponsible for.** 
31e0: 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
31f0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
3200: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
3210: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   freed..**.** Th
3220: 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73  e caller retains
3230: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56   ownership of pV
3240: 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74  ector.  If pVect
3250: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
3260: 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  T,.** then the r
3270: 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77  eturned object w
3280: 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56  ill reference pV
3290: 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65  ector and so pVe
32a0: 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e  ctor must remain
32b0: 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68  .** valid for th
32c0: 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65  e life of the re
32d0: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20  turned object.  
32e0: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
32f0: 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20  TK_VECTOR.** or 
3300: 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
3310: 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e  ion, then it can
3320: 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73   be deleted as s
3330: 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74  oon as this rout
3340: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a  ine.** returns..
3350: 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f  **.** A trick to
3360: 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45   cause a TK_SELE
3370: 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  CT pVector to be
3380: 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65   deleted togethe
3390: 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65  r with.** the re
33a0: 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65  turned Expr obje
33b0: 63 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20  ct is to attach 
33c0: 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74  the pVector to t
33d0: 68 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a  he pRight field.
33e0: 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ** of the return
33f0: 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ed TK_SELECT_COL
3400: 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e  UMN Expr object.
3410: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3420: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
3430: 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eld(.  Parse *pP
3440: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
3450: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
3460: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
3470: 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r,       /* The 
3480: 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66  vector.  List of
3490: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
34a0: 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a  a sub-SELECT */.
34b0: 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20    int iField    
34c0: 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
34d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
34e0: 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  ctor to return *
34f0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65  /.){.  Expr *pRe
3500: 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72  t;.  if( pVector
3510: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3520: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3530: 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20  Vector->flags & 
3540: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
3550: 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45      /* The TK_SE
3560: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
3570: 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   node:.    **.  
3580: 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20    ** pLeft:     
3590: 20 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f        pVector co
35a0: 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45  ntaining TK_SELE
35b0: 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64  CT.  Not deleted
35c0: 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a  ..    ** pRight:
35d0: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73            not us
35e0: 65 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69  ed.  But recursi
35f0: 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20  vely deleted..  
3600: 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20    ** iColumn:   
3610: 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61        Index of a
3620: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74   column in pVect
3630: 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65  or.    ** iTable
3640: 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20  :          0 or 
3650: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3660: 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53  lumns on the LHS
3670: 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e   of an assignmen
3680: 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e  t.    ** pLeft->
3690: 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20  iTable:   First 
36a0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
36b0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
36c0: 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20  result, or 0.   
36d0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
36e0: 20 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75       if the resu
36f0: 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f  lt is not yet co
3700: 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  mputed..    **. 
3710: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
3720: 72 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66  rDelete() specif
3730: 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65  ically skips the
3740: 20 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74   recursive delet
3750: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66  e of.    ** pLef
3760: 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43  t on TK_SELECT_C
3770: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75  OLUMN nodes.  Bu
3780: 74 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c  t pRight is foll
3790: 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72  owed, so pVector
37a0: 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61  .    ** can be a
37b0: 74 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68  ttached to pRigh
37c0: 74 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20  t to cause this 
37d0: 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e  node to take own
37e0: 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a  ership of.    **
37f0: 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63   pVector.  Typic
3800: 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20  ally there will 
3810: 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53  be multiple TK_S
3820: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ELECT_COLUMN nod
3830: 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  es.    ** with t
3840: 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f  he same pLeft po
3850: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65  inter to the pVe
3860: 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f  ctor, but only o
3870: 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ne of them.    *
3880: 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70  * will own the p
3890: 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  Vector..    */. 
38a0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
38b0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
38c0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c  K_SELECT_COLUMN,
38d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
38e0: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52  pRet ){.      pR
38f0: 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46  et->iColumn = iF
3900: 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74  ield;.      pRet
3910: 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f  ->pLeft = pVecto
3920: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
3930: 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20  ert( pRet==0 || 
3940: 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  pRet->iTable==0 
3950: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3960: 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d  if( pVector->op=
3970: 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65  =TK_VECTOR ) pVe
3980: 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  ctor = pVector->
3990: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
39a0: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52  d].pExpr;.    pR
39b0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
39c0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
39d0: 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d  pVector, 0);.  }
39e0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
39f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  }../*.** If expr
3a00: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
3a10: 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43  of type TK_SELEC
3a20: 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
3a30: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
3a40: 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72  it. Return the r
3a50: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
3a60: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
3a70: 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68  tored (or, if th
3a80: 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
3a90: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3aa0: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74  an one column, t
3ab0: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
3ac0: 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73  rray.** of regis
3ad0: 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68  ters in which th
3ae0: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3af0: 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ed)..**.** If pE
3b00: 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f  xpr is not a TK_
3b10: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
3b20: 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  n, return 0..*/.
3b30: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
3b40: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
3b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3b60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
3b70: 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  reg = 0;.#ifndef
3b80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3b90: 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
3ba0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
3bb0: 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71   ){.    reg = sq
3bc0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
3bd0: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
3be0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
3bf0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
3c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
3c10: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
3c20: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
3c30: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
3c40: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
3c50: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
3c60: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
3c70: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
3c80: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
3c90: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
3ca0: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
3cb0: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
3cc0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
3cd0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
3ce0: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
3cf0: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
3d00: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
3d10: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
3d20: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
3d30: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
3d40: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3d50: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
3d60: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
3d70: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
3d80: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
3d90: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
3da0: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
3db0: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3dc0: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
3dd0: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
3de0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
3df0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
3e00: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
3e10: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3e20: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
3e30: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
3e40: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
3e50: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
3e60: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
3e70: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
3e80: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3e90: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
3ea0: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
3eb0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
3ec0: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
3ed0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
3ee0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
3ef0: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
3f00: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
3f10: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
3f20: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
3f30: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
3f40: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
3f50: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
3f60: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
3f70: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
3f80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fa0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3fb0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
3fc0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
3fd0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
3fe0: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
3ff0: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4000: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4020: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4030: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
4040: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
4070: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4080: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
4090: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
40a0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
40b0: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
40c0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
40d0: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
40e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
40f0: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4100: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4110: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4120: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4130: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
4140: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
4150: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
4160: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
4170: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
4180: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
4190: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
41a0: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
41b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
41c0: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
41d0: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
41e0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
41f0: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4200: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4210: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4220: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4230: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
4240: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
4250: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
4260: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
4270: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
4280: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
4290: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
42a0: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
42b0: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
42c0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
42d0: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
42e0: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
42f0: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4300: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4310: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4320: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4330: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
4340: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
4350: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
4360: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4370: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
4380: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
4390: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
43a0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43b0: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
43c0: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
43d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
43e0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43f0: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4400: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4410: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4420: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
4440: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
4450: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
4460: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
4470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
4480: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4490: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
44a0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
44b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
44c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
44d0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
44e0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4500: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4510: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4520: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4540: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
4550: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4570: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
4580: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
4590: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
45a0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
45b0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
45c0: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
45d0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
45e0: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
45f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4600: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4610: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4620: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4630: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4640: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4650: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4660: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4670: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28  Label(v);..  if(
4680: 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45   nLeft!=sqlite3E
4690: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
46a0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
46b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
46c0: 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
46d0: 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72  misused");.    r
46e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
46f0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4700: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4710: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
4720: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
4730: 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IS || pExpr->
4740: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20  op==TK_ISNOT .  
4750: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4760: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70  p==TK_LT || pExp
4770: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20  r->op==TK_GT .  
4780: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4790: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70  p==TK_LE || pExp
47a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20  r->op==TK_GE .  
47b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
47c0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70  pr->op==op || (p
47d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
47e0: 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20  && op==TK_EQ).  
47f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45            || (pE
4800: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4810: 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20  T && op==TK_NE) 
4820: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d  );.  assert( p5=
4830: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21  =0 || pExpr->op!
4840: 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =op );.  assert(
4850: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
4860: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
4870: 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20  =op );..  p5 |= 
4880: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a  SQLITE_STOREP2;.
4890: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45    if( opx==TK_LE
48a0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a   ) opx = TK_LT;.
48b0: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45    if( opx==TK_GE
48c0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a   ) opx = TK_GT;.
48d0: 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70  .  regLeft = exp
48e0: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
48f0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
4900: 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72   regRight = expr
4910: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4920: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a  arse, pRight);..
4930: 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c    for(i=0; 1 /*L
4940: 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72  oop exits by "br
4950: 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20  eak"*/; i++){.  
4960: 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
4970: 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30   0, regFree2 = 0
4980: 3b 0a 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 69 6e 74 20 72 31  *pR; .    int r1
49a0: 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74  , r2;.    assert
49b0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66  ( i>=0 && i<nLef
49c0: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30  t );.    if( i>0
49d0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61   ) sqlite3ExprCa
49e0: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
49f0: 0a 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65  .    r1 = exprVe
4a00: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4a10: 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72  rse, pLeft, i, r
4a20: 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65  egLeft, &pL, &re
4a30: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20  gFree1);.    r2 
4a40: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4a50: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69  ster(pParse, pRi
4a60: 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74  ght, i, regRight
4a70: 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32  , &pR, &regFree2
4a80: 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  );.    codeCompa
4a90: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
4aa0: 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20  R, opx, r1, r2, 
4ab0: 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74  dest, p5);.    t
4ac0: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4ad0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4ae0: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4af0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b00: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4b10: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4b20: 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Le);.    testc
4b30: 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
4b40: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4b50: 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
4b60: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4b70: 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
4b80: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
4b90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4ba0: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
4bb0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4bc0: 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73  =OP_Eq);.    tes
4bd0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
4be0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4bf0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
4c00: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4c10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4c20: 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20   regFree1);.    
4c30: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4c40: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4c50: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28  gFree2);.    if(
4c60: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4c70: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4c80: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  e);.    if( i==n
4c90: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4cb0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
4cc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4ce0: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
4cf0: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
4d00: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4d10: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4d20: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
4d30: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
4d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4d50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4d60: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4d70: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4d80: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
4d90: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4da0: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
4db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
4dc0: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
4dd0: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
4de0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
4df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
4e10: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
4e20: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
4e30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4e40: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
4e50: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4e60: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
4e70: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4e80: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4e90: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
4ea0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4eb0: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
4ec0: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4ed0: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
4ee0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4ef0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4f00: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
4f10: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
4f20: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
4f30: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
4f40: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
4f50: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
4f60: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
4f70: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
4f80: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
4f90: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
4fa0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
4fb0: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
4fc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
4fd0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
4fe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
4ff0: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5000: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5010: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
5020: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
5030: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5040: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
5050: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
5060: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
5070: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5080: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5090: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
50a0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
50b0: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
50c0: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
50d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
50e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
50f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5100: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5110: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
5120: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
5130: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
5140: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
5150: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
5160: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
5170: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5180: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5190: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
51a0: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
51b0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
51c0: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
51d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
51e0: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
51f0: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5200: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5210: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
5220: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
5230: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
5240: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
5250: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
5260: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
5270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5280: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5290: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
52a0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
52b0: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
52c0: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
52d0: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
52e0: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
52f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5300: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5310: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5340: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
5350: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
5360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
5370: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5380: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5390: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
53a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
53b0: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
53c0: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
53d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
53e0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
53f0: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
5400: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5410: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
5420: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
5430: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5440: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
5450: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5460: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
5470: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
5480: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5490: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
54a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
54b0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
54c0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
54d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54e0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
54f0: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5500: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5510: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
5520: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
5530: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
5540: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5550: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
5560: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5570: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
5580: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
5590: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
55a0: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
55b0: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
55c0: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
55d0: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
55e0: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
55f0: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
5600: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
5610: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5620: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
5630: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
5640: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  plus one..**.** 
5650: 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45  Also propagate E
5660: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5670: 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78  s up from Expr.x
5680: 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66  .pList to Expr.f
5690: 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72  lags,.** if appr
56a0: 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
56b0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
56c0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
56d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
56e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
56f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
5700: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5710: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
5720: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
5730: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5740: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5750: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
5760: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
5770: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
5780: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5790: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
57a0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
57b0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48  (p->x.pList, &nH
57c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66  eight);.    p->f
57d0: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
57e0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
57f0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5800: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
5810: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
5820: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
5830: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5840: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5850: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
5860: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
5870: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
5880: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5890: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
58a0: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
58b0: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
58c0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
58d0: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  pParse..**.** Al
58e0: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c  so propagate all
58f0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5900: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5910: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
5920: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
5930: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5940: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
5950: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
5960: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
5970: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
5980: 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72  ) return;.  expr
5990: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
59a0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
59b0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
59c0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
59d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
59e0: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
59f0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5a00: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5a10: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
5a20: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
5a30: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
5a40: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5a50: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5a60: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5a70: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5a80: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5a90: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5aa0: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5ab0: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f  ;.}.#else /* ABO
5ac0: 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f  VE:  Height enfo
5ad0: 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e  rcement enabled.
5ae0: 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20    BELOW: Height 
5af0: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20  enforcement off 
5b00: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61  */./*.** Propaga
5b10: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5b20: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5b30: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5b40: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5b50: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5b60: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5b70: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5b80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5b90: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
5ba0: 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70  >x.pList && !Exp
5bb0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5bc0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5bd0: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5be0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5bf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c00: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5c10: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5c20: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
5c30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5c40: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
5c50: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
5c60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
5c70: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
5c80: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
5c90: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
5ca0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
5cb0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
5cc0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
5cd0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
5ce0: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
5cf0: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
5d00: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
5d10: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
5d20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5d30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
5d40: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
5d50: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
5d60: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
5d70: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
5d80: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
5d90: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
5da0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
5db0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
5dc0: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
5dd0: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
5de0: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
5df0: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
5e00: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ing is performed
5e10: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
5e20: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
5e30: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
5e40: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
5e50: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
5e60: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
5e70: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
5e80: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
5e90: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
5ea0: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
5eb0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
5ec0: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
5ed0: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
5ee0: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
5ef0: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
5f00: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
5f10: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
5f20: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5f30: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
5f40: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
5f50: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
5f60: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
5f70: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
5f80: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
5f90: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
5fa0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
5fb0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
5fc0: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
5fd0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
5fe0: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
5ff0: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
6000: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
6010: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
6020: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
6030: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
6040: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
6050: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6060: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6080: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6090: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20  DbMallocRawNN() 
60a0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60c0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
60d0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
60e0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
60f0: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6100: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6110: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
6120: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
6130: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
6140: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6150: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
6160: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
6170: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lue = 0;..  asse
6180: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
6190: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
61a0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
61b0: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
61c0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
61d0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
61e0: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
61f0: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
6200: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
6210: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
6220: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
6230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
6240: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
6250: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
6260: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
6270: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
6280: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
6290: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
62a0: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
62b0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
62c0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
62d0: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
62e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
62f0: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
6300: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6310: 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
6320: 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 70 4e  Leaf;.        pN
6330: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
6340: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
6350: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
6360: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
6370: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
6380: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
6390: 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54  oken->z!=0 || pT
63a0: 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  oken->n==0 );.  
63b0: 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e        if( pToken
63c0: 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65  ->n ) memcpy(pNe
63d0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f  w->u.zToken, pTo
63e0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
63f0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  n);.        pNew
6400: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65  ->u.zToken[pToke
6410: 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  n->n] = 0;.     
6420: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
6430: 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65  & sqlite3Isquote
6440: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  (pNew->u.zToken[
6450: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
6460: 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f   if( pNew->u.zTo
6470: 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e  ken[0]=='"' ) pN
6480: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
6490: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
64a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
64b0: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
64c0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  en);.        }. 
64d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
64e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
64f0: 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65  _DEPTH>0.    pNe
6500: 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a  w->nHeight = 1;.
6510: 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72  #endif  .  }.  r
6520: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
6530: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
6540: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
6550: 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  ode from a zero-
6560: 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e  terminated token
6570: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72   that has.** alr
6580: 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74  eady been dequot
6590: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
65a0: 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69  ite3Expr(.  sqli
65b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
65c0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
65d0: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
65e0: 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20  cZero() (may be 
65f0: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  null) */.  int o
6600: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6610: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6620: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
6630: 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20  st char *zToken 
6640: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72       /* Token ar
6650: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
6660: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
6670: 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20  oken x;.  x.z = 
6680: 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20  zToken;.  x.n = 
6690: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
66a0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  zToken);.  retur
66b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
66c0: 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30  oc(db, op, &x, 0
66d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61  );.}../*.** Atta
66e0: 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  ch subtrees pLef
66f0: 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20  t and pRight to 
6700: 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52  the Expr node pR
6710: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52  oot..**.** If pR
6720: 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  oot==NULL that m
6730: 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f  eans that a memo
6740: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6750: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
6760: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73  ..** In that cas
6770: 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75  e, delete the su
6780: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6790: 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64   pRight..*/.void
67a0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
67b0: 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71  chSubtrees(.  sq
67c0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70  lite3 *db,.  Exp
67d0: 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72  r *pRoot,.  Expr
67e0: 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20   *pLeft,.  Expr 
67f0: 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28  *pRight.){.  if(
6800: 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20   pRoot==0 ){.   
6810: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
6820: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
6830: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6840: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
6850: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6860: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
6870: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
6880: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
6890: 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74     pRoot->pRight
68a0: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
68b0: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
68c0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
68d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
68e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
68f0: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
6900: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
6910: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
6920: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
6930: 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c  gate & pLeft->fl
6940: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ags;.    }.    e
6950: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
6960: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
6970: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78  * Allocate an Ex
6980: 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f  pr node which jo
6990: 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  ins as many as t
69a0: 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a  wo subtrees..**.
69b0: 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  ** One or both o
69c0: 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63  f the subtrees c
69d0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74  an be NULL.  Ret
69e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
69f0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72   the new.** Expr
6a00: 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61   node.  Or, if a
6a10: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
6a20: 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e  rs, set pParse->
6a30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6a40: 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75  ,.** free the su
6a50: 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72  btrees and retur
6a60: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20  n NULL..*/.Expr 
6a70: 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20  *sqlite3PExpr(. 
6a80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6aa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6ab0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
6ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6ad0: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
6ae0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
6af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6b00: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
6b10: 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20 20  Expr *pRight    
6b20: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
6b30: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20   operand */.){. 
6b40: 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20   Expr *p;.  if( 
6b50: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50  op==TK_AND && pP
6b60: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
6b70: 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76  .    /* Take adv
6b80: 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d  antage of short-
6b90: 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70  circuit false op
6ba0: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41  timization for A
6bb0: 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71  ND */.    p = sq
6bc0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
6bd0: 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20  rse->db, pLeft, 
6be0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
6bf0: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
6c00: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
6c10: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
6c20: 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 69 66  f(Expr));.    if
6c30: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ( p ){.      mem
6c40: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
6c50: 28 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20 70  (Expr));.      p
6c60: 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46 4c  ->op = op & TKFL
6c70: 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70 2d  G_MASK;.      p-
6c80: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
6c90: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
6ca0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
6cb0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70  pParse->db, p, p
6cc0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
6cd0: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20   }.  if( p ) {. 
6ce0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68     sqlite3ExprCh
6cf0: 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65  eckHeight(pParse
6d00: 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20  , p->nHeight);. 
6d10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
6d20: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c  ../*.** Add pSel
6d30: 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e  ect to the Expr.
6d40: 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e  x.pSelect field.
6d50: 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69    Or, if pExpr i
6d60: 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64  s NULL (due.** d
6d70: 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  o a memory alloc
6d80: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74  ation failure) t
6d90: 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70  hen delete the p
6da0: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a  Select object..*
6db0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45  /.void sqlite3PE
6dc0: 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72  xprAddSelect(Par
6dd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6de0: 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20   *pExpr, Select 
6df0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28  *pSelect){.  if(
6e00: 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45   pExpr ){.    pE
6e10: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  xpr->x.pSelect =
6e20: 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78   pSelect;.    Ex
6e30: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6e40: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
6e50: 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a  t|EP_Subquery);.
6e60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
6e70: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
6e80: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
6e90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6ea0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
6eb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6ec0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
6ed0: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
6ee0: 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  ->db, pSelect);.
6ef0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
6f00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6f10: 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
6f20: 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28   TRUE or FALSE (
6f30: 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a  respectively),.*
6f40: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e  * then return 1.
6f50: 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20    If one cannot 
6f60: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72  determine the tr
6f70: 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65  uth value of the
6f80: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
6f90: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72  t compile-time r
6fa0: 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  eturn 0..**.** T
6fb0: 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
6fc0: 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f  zation.  If is O
6fd0: 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65  K to return 0 he
6fe0: 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68  re even if.** th
6ff0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61  e expression rea
7000: 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61  lly is always fa
7010: 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20  lse or false (a 
7020: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e  false negative).
7030: 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20  .** But it is a 
7040: 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20  bug to return 1 
7050: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7060: 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66  n might have dif
7070: 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61  ferent.** boolea
7080: 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66  n values in diff
7090: 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e  erent circumstan
70a0: 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73  ces (a false pos
70b0: 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f  itive.).**.** No
70c0: 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65  te that if the e
70d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72  xpression is par
70e0: 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  t of conditional
70f0: 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a   for a.** LEFT J
7100: 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  OIN, then we can
7110: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74  not determine at
7120: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
7130: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
7140: 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61  is it true or fa
7150: 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72  lse, so always r
7160: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
7170: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
7180: 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a  sTrue(Expr *p){.
7190: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
71a0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
71b0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
71c0: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
71d0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
71e0: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
71f0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
7200: 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73  return v!=0;.}.s
7210: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c  tatic int exprAl
7220: 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a  waysFalse(Expr *
7230: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
7240: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
7250: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
7260: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
7270: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
7280: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
7290: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
72a0: 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b  ;.  return v==0;
72b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74  .}../*.** Join t
72c0: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  wo expressions u
72d0: 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72  sing an AND oper
72e0: 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72  ator.  If either
72f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
7300: 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73  * NULL, then jus
7310: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68  t return the oth
7320: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  er expression..*
7330: 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65  *.** If one side
7340: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
7350: 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77   the AND is know
7360: 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74  n to be false, t
7370: 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  hen instead.** o
7380: 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41  f returning an A
7390: 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a  ND expression, j
73a0: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e  ust return a con
73b0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
73c0: 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65   with.** a value
73d0: 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78   of false..*/.Ex
73e0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41  pr *sqlite3ExprA
73f0: 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
7400: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
7410: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66  r *pRight){.  if
7420: 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  ( pLeft==0 ){.  
7430: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
7440: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
7450: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
7460: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
7470: 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
7480: 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c  ysFalse(pLeft) |
7490: 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  | exprAlwaysFals
74a0: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
74b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
74c0: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
74d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
74e0: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
74f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
7500: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
7510: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
7520: 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
7530: 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  0], 0);.  }else{
7540: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20  .    Expr *pNew 
7550: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7560: 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30  oc(db, TK_AND, 0
7570: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7580: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
7590: 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c  ees(db, pNew, pL
75a0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
75b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20    return pNew;. 
75c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
75d0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
75e0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
75f0: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
7600: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
7610: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
7620: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
7630: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
7640: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
7650: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
7660: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  n){.  Expr *pNew
7670: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7680: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7690: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
76a0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
76b0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
76c0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
76d0: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
76e0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
76f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7700: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
7710: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
7720: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7730: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
7740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
7750: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
7760: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ist;.  assert( !
7770: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7780: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
7790: 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ct) );.  sqlite3
77a0: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
77b0: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e  Flags(pParse, pN
77c0: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
77d0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
77e0: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
77f0: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
7800: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
7810: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
7820: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
7830: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
7840: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
7850: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
7860: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
7870: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
7880: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
7890: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
78a0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
78b0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
78c0: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
78d0: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
78e0: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
78f0: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
7900: 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76  ot too big to av
7910: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
7920: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
7930: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
7940: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
7950: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
7960: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
7970: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7980: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
7990: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
79a0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
79b0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
79c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
79d0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
79e0: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
79f0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
7a00: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
7a10: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
7a20: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
7a30: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
7a40: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
7a50: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
7a60: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
7a70: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
7a80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7a90: 45 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20  Expr, u32 n){.  
7aa0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7ab0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73  arse->db;.  cons
7ac0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56  t char *z;.  ynV
7ad0: 61 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78  ar x;..  if( pEx
7ae0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
7af0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
7b00: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
7b10: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  , EP_IntValue|EP
7b20: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
7b30: 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20  nOnly) );.  z = 
7b40: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
7b50: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
7b60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30  );.  assert( z[0
7b70: 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ]!=0 );.  assert
7b80: 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65  ( n==(u32)sqlite
7b90: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a  3Strlen30(z) );.
7ba0: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b    if( z[1]==0 ){
7bb0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
7bc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
7bd0: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
7be0: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
7bf0: 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
7c00: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20  ( z[0]=='?' );. 
7c10: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
7c20: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
7c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
7c40: 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20   doAdd = 0;.    
7c50: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
7c60: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
7c70: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7c80: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
7c90: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
7ca0: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
7cb0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
7cc0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7cd0: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
7ce0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20       int bOk;.  
7cf0: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20      if( n==2 ){ 
7d00: 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
7d10: 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20  F-TRUE*/.       
7d20: 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20   i = z[1]-'0';  
7d30: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
7d40: 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73  se of ?N for a s
7d50: 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f  ingle digit N */
7d60: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
7d70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7d80: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d         bOk = 0==
7d90: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a  sqlite3Atoi64(&z
7da0: 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51  [1], &i, n-1, SQ
7db0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
7dc0: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
7dd0: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
7de0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
7df0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7e00: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7e10: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7e20: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
7e30: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7e40: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7e50: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7e60: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7e70: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
7e80: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
7e90: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7ea0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
7eb0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
7ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7ed0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
7ee0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
7ef0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
7f00: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
7f10: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
7f20: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7f30: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
7f40: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7f50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7f60: 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20  x = (ynVar)i;.  
7f70: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
7f80: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
7f90: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
7fa0: 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20   (int)x;.       
7fb0: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
7fc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
7fd0: 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
7fe0: 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
7ff0: 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , x)==0 ){.     
8000: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8010: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8020: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
8030: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
8040: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
8050: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
8060: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
8070: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
8080: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
8090: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
80a0: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
80b0: 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  name.      ** ha
80c0: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
80d0: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
80e0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
80f0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f   number.      */
8100: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8110: 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61  r)sqlite3VListNa
8120: 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e  meToNum(pParse->
8130: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20  pVList, z, n);. 
8140: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b       if( x==0 ){
8150: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e  .        x = (yn
8160: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
8170: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f  Var);.        do
8180: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
8190: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
81a0: 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50  oAdd ){.      pP
81b0: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73  arse->pVList = s
81c0: 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64  qlite3VListAdd(d
81d0: 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  b, pParse->pVLis
81e0: 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20  t, z, n, x);.   
81f0: 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e   }.  }.  pExpr->
8200: 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69  iColumn = x;.  i
8210: 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  f( x>db->aLimit[
8220: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8230: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
8240: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8250: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8260: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
8270: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
8280: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
8290: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
82a0: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
82b0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
82c0: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
82d0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
82e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
82f0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
8300: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
8310: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
8320: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
8330: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
8340: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
8350: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
8360: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8370: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
8380: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
8390: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
83a0: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
83b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
83c0: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
83d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
83e0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
83f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8400: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
8410: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
8420: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
8430: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
8440: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
8450: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
8460: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
8470: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
8480: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8490: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
84a0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
84b0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
84c0: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
84d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
84e0: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
84f0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8500: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8510: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
8520: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
8530: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8540: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
8550: 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
8560: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8570: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
8580: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
8590: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
85a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
85b0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
85c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
85d0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
85e0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
85f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8600: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8610: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  ete(db, p->x.pLi
8620: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
8630: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8640: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
8650: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
8660: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
8670: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78  oken);.  if( !Ex
8680: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8690: 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20   EP_Static) ){. 
86a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
86b0: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  NN(db, p);.  }.}
86c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
86d0: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
86e0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
86f0: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
8700: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8710: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
8720: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8730: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
8740: 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ed for the expre
8750: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
8760: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
8770: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8780: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
8790: 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c   one of EXPR_FUL
87a0: 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52  LSIZE,.** EXPR_R
87b0: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58  EDUCEDSIZE or EX
87c0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
87d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
87e0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  exprStructSize(E
87f0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45  xpr *p){.  if( E
8800: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8810: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
8820: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f  ) return EXPR_TO
8830: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69  KENONLYSIZE;.  i
8840: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8850: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8860: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8870: 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72  REDUCEDSIZE;.  r
8880: 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53  eturn EXPR_FULLS
8890: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  IZE;.}../*.** Th
88a0: 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65  e dupedExpr*Size
88b0: 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68  () routines each
88c0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
88d0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
88e0: 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ired.** to store
88f0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
8900: 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72  pression or expr
8910: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68  ession tree.  Th
8920: 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20  ey differ in.** 
8930: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20  how much of the 
8940: 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64  tree is measured
8950: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65  ..**.**     dupe
8960: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8970: 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e  )     Size of on
8980: 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75  ly the Expr stru
8990: 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75  cture .**     du
89a0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
89b0: 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20  )       Size of 
89c0: 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72  Expr + space for
89d0: 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75   token.**     du
89e0: 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20  pedExprSize()   
89f0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74          Expr + t
8a00: 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63  oken + subtree c
8a10: 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a  omponents.**.***
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a60: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
8a70: 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75  he dupedExprStru
8a80: 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f  ctSize() functio
8a90: 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61  n returns two va
8aa0: 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74  lues OR-ed toget
8ab0: 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68  her:  .** (1) th
8ac0: 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
8ad0: 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74   for a copy of t
8ae0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
8af0: 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28  e only and .** (
8b00: 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c  2) the EP_xxx fl
8b10: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74  ags that indicat
8b20: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63  e what the struc
8b30: 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64  ture size should
8b40: 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75   be..** The retu
8b50: 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77  rn values is alw
8b60: 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a  ays one of:.**.*
8b70: 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c  *      EXPR_FULL
8b80: 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50  SIZE.**      EXP
8b90: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20  R_REDUCEDSIZE   
8ba0: 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20  | EP_Reduced.** 
8bb0: 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f       EXPR_TOKENO
8bc0: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
8bd0: 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65  enOnly.**.** The
8be0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72   size of the str
8bf0: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f  ucture can be fo
8c00: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
8c10: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
8c20: 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ** of this routi
8c30: 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20  ne with 0xfff.  
8c40: 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65  The flags can be
8c50: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
8c60: 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  g the.** return 
8c70: 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65  value with EP_Re
8c80: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
8c90: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ly..**.** Note t
8ca0: 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d  hat with flags==
8cb0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
8cc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f  this routines wo
8cd0: 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65  rks on full-size
8ce0: 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20  .** (unreduced) 
8cf0: 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20  Expr objects as 
8d00: 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c  they or original
8d10: 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ly constructed b
8d20: 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a  y the parser..**
8d30: 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69   During expressi
8d40: 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74  on analysis, ext
8d50: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
8d60: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d  s computed and m
8d70: 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74  oved into.** lat
8d80: 65 72 20 70 61 72 74 73 20 6f 66 20 74 65 68 20  er parts of teh 
8d90: 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  Expr object and 
8da0: 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72  that extra infor
8db0: 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74  mation might get
8dc0: 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20   chopped.** off 
8dd0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
8de0: 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e  n is reduced.  N
8df0: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74  ote also that it
8e00: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74   does not work t
8e10: 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50  o.** make an EXP
8e20: 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79  RDUP_REDUCE copy
8e30: 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78   of a reduced ex
8e40: 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73  pression.  It is
8e50: 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74   only legal.** t
8e60: 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74  o reduce a prist
8e70: 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ine expression t
8e80: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ree from the par
8e90: 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ser.  The implem
8ea0: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64  entation.** of d
8eb0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8ec0: 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c  ze() contain mul
8ed0: 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73  tiple assert() s
8ee0: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61  tatements that a
8ef0: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66  ttempt.** to enf
8f00: 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72  orce this constr
8f10: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
8f20: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
8f30: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
8f40: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
8f50: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65  nt nSize;.  asse
8f60: 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  rt( flags==EXPRD
8f70: 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61  UP_REDUCE || fla
8f80: 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79  gs==0 ); /* Only
8f90: 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20   one flag value 
8fa0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73  allowed */.  ass
8fb0: 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49  ert( EXPR_FULLSI
8fc0: 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61  ZE<=0xfff );.  a
8fd0: 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20  ssert( (0xfff & 
8fe0: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
8ff0: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
9000: 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20  .  if( 0==flags 
9010: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  || p->op==TK_SEL
9020: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
9030: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
9040: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
9050: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
9060: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9070: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
9080: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
9090: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
90a0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
90b0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
90c0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
90d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
90e0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
90f0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9100: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9110: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
9120: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
9130: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
9140: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
9150: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
9160: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
9170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
9180: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
9190: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
91a0: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
91b0: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
91c0: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
91d0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
91e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
91f0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9200: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
9210: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
9220: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
9230: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
9240: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
9250: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
9260: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
9270: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
9280: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
9290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
92a0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
92b0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
92c0: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
92d0: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
92e0: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
92f0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
9300: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9310: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
9320: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
9330: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
9340: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9350: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
9360: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
9370: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
9380: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9390: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
93a0: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
93b0: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
93c0: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
93d0: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
93e0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
93f0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
9400: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
9410: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
9420: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
9430: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
9440: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
9450: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
9460: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
9470: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
9480: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
9490: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
94a0: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
94b0: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
94c0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
94d0: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
94e0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
94f0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
9500: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
9510: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
9520: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
9530: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
9540: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
9550: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
9560: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
9570: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
9580: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
9590: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
95a0: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
95b0: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
95c0: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
95d0: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
95e0: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
95f0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9600: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
9610: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
9620: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
9630: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9640: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
9650: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
9660: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
9670: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
9680: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
9690: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
96a0: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
96b0: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
96c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
96d0: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
96e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
96f0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
9700: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
9710: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
9720: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
9730: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
9740: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
9750: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
9760: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
9770: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
9780: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
9790: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
97a0: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
97b0: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
97c0: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
97d0: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
97e0: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
97f0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
9800: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
9810: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
9820: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
9830: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
9840: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
9850: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
9860: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
9870: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
9880: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
9890: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
98a0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
98b0: 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20  nt dupFlags, u8 
98c0: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
98d0: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
98e0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
98f0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20   return */.  u8 
9900: 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  *zAlloc;        
9910: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
9920: 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  ce from which to
9930: 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65   build Expr obje
9940: 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74  ct */.  u32 stat
9950: 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  icFlag;       /*
9960: 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70   EP_Static if sp
9970: 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64  ace not obtained
9980: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a   from malloc */.
9990: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
99a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20   );.  assert( p 
99b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70  );.  assert( dup
99c0: 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46  Flags==0 || dupF
99d0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
99e0: 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74  DUCE );.  assert
99f0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
9a00: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
9a10: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20  UP_REDUCE );..  
9a20: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
9a30: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
9a40: 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74   new Expr struct
9a50: 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a  ure. */.  if( pz
9a60: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41  Buffer ){.    zA
9a70: 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72  lloc = *pzBuffer
9a80: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
9a90: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
9aa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f  }else{.    zAllo
9ab0: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
9ac0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70  locRawNN(db, dup
9ad0: 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75  edExprSize(p, du
9ae0: 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74  pFlags));.    st
9af0: 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20  aticFlag = 0;.  
9b00: 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72  }.  pNew = (Expr
9b10: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66   *)zAlloc;..  if
9b20: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a  ( pNew ){.    /*
9b30: 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f   Set nNewSize to
9b40: 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61   the size alloca
9b50: 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75  ted for the stru
9b60: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
9b70: 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e  .    ** by pNew.
9b80: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
9b90: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
9ba0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
9bb0: 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  or.    ** EXPR_T
9bc0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
9bd0: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
9be0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
9bf0: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
9c00: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
9c10: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
9c20: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
9c30: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  )..    */.    co
9c40: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
9c50: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
9c60: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
9c70: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
9c80: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
9c90: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
9ca0: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69  e & 0xfff;.    i
9cb0: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  nt nToken;.    i
9cc0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
9cd0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
9ce0: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
9cf0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  en ){.      nTok
9d00: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
9d10: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
9d20: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ) + 1;.    }else
9d30: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
9d40: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
9d50: 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20  ( dupFlags ){.  
9d60: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
9d70: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9d80: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
9d90: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
9da0: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
9db0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9dc0: 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d       u32 nSize =
9dd0: 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74   (u32)exprStruct
9de0: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d  Size(p);.      m
9df0: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
9e00: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69   nSize);.      i
9e10: 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55  f( nSize<EXPR_FU
9e20: 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20  LLSIZE ){ .     
9e30: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
9e40: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
9e50: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
9e60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9e70: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
9e80: 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f   EP_Reduced, EP_
9e90: 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45  TokenOnly, and E
9ea0: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61  P_Static flags a
9eb0: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
9ec0: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9ed0: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
9ee0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
9ef0: 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f  _Static|EP_MemTo
9f00: 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ken);.    pNew->
9f10: 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74  flags |= nStruct
9f20: 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63  Size & (EP_Reduc
9f30: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
9f40: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
9f50: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
9f60: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
9f70: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
9f80: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
9f90: 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
9fa0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
9fb0: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
9fc0: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
9fd0: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
9fe0: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
9ff0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
a000: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
a010: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
a020: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
a030: 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f  >flags) & (EP_To
a040: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a050: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a060: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a070: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a080: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a090: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a0a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a0b0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a0d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a0e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a0f0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a100: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a120: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a130: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a140: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a150: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a170: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a180: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a190: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a1a0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a1b0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a1c0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a1d0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a1e0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a1f0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a200: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a210: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a220: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a230: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a240: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a250: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a260: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a270: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a280: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a290: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a2a0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a2b0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a2c0: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2e0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a2f0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a300: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a310: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a320: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a    }.      if( pz
a330: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a340: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a350: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a360: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a370: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a380: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
a390: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a3a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
a3b0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
a3c0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a3d0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a3e0: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a400: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70  >iColumn==0 || p
a410: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
a420: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a430: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c   p->pRight==0  |
a440: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e  | p->pRight==p->
a450: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
a460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a470: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a480: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a490: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
a4a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a4b0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a4c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a4d0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a4e0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a4f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a500: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
a510: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
a520: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
a530: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
a540: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
a550: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
a560: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
a570: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
a580: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a590: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
a5a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
a5b0: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
a5c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a5d0: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
a5e0: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
a5f0: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
a600: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
a610: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
a620: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
a630: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
a640: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
a650: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
a660: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a670: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
a680: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
a690: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a6a0: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
a6b0: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
a6c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a6d0: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
a6e0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a6f0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a700: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a710: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
a720: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a730: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
a740: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a750: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
a760: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
a770: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
a780: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a790: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
a7a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
a7b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a7c0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
a7d0: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
a7e0: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
a7f0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a800: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
a810: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
a820: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
a830: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
a840: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
a850: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
a860: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
a870: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
a880: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
a890: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
a8a0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
a8b0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
a8c0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
a8d0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
a8e0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
a8f0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
a900: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
a910: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
a920: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
a930: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
a940: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
a950: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
a960: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
a970: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
a980: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
a990: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
a9a0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
a9b0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
a9c0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
a9d0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
a9e0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
a9f0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
aa00: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
aa10: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
aa20: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
aa30: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
aa40: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
aa50: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
aa60: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
aa70: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
aa80: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
aa90: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
aaa0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
aab0: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
aac0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
aad0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
aae0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
aaf0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
ab00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
ab10: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
ab20: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
ab30: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
ab40: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
ab50: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
ab60: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
ab70: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
ab80: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
ab90: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
aba0: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
abb0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
abc0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
abd0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
abe0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
abf0: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
ac00: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
ac10: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ac20: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
ac30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
ac40: 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43  r *pPriorSelectC
ac50: 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ol = 0;.  assert
ac60: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
ac70: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
ac80: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
ac90: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
aca0: 64 62 2c 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  db, sqlite3DbMal
acb0: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 29 29 3b  locSize(db, p));
acc0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
acd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
ace0: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45  w->nExpr = p->nE
acf0: 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  xpr;.  pItem = p
ad00: 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74  New->a;.  pOldIt
ad10: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
ad20: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
ad30: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
ad40: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
ad50: 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20   Expr *pOldExpr 
ad60: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
ad70: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  r;.    Expr *pNe
ad80: 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  wExpr;.    pItem
ad90: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
ada0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
adb0: 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20  dExpr, flags);. 
adc0: 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20     if( pOldExpr 
add0: 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70  .     && pOldExp
ade0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
adf0: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20  _COLUMN.     && 
ae00: 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65  (pNewExpr = pIte
ae10: 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20  m->pExpr)!=0 .  
ae20: 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
ae30: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
ae40: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29  lumn==0 || i>0 )
ae50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
ae60: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  Expr->iColumn==0
ae70: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
ae80: 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c  rt( pOldExpr->pL
ae90: 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70  eft==pOldExpr->p
aea0: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20  Right );.       
aeb0: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
aec0: 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65   = pNewExpr->pLe
aed0: 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ft = pNewExpr->p
aee0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c  Right;.      }el
aef0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
af00: 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
af10: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
af20: 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  [-1].pExpr!=0 );
af30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
af40: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
af50: 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45  mn==pItem[-1].pE
af60: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29  xpr->iColumn+1 )
af70: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
af80: 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f  ( pPriorSelectCo
af90: 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  l==pItem[-1].pEx
afa0: 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  pr->pLeft );.   
afb0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70       pNewExpr->p
afc0: 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c  Left = pPriorSel
afd0: 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  ectCol;.      }.
afe0: 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d      }.    pItem-
aff0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
b000: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b010: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
b020: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
b030: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b040: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b050: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
b060: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
b070: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
b080: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  er;.    pItem->d
b090: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  one = 0;.    pIt
b0a0: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  em->bSpanIsTab =
b0b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e   pOldItem->bSpan
b0c0: 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d  IsTab;.    pItem
b0d0: 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ->u = pOldItem->
b0e0: 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  u;.  }.  return 
b0f0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
b100: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
b110: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
b120: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
b130: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
b140: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
b150: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
b160: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
b170: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
b180: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b190: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
b1a0: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
b1b0: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
b1c0: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
b1d0: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
b1e0: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
b1f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b200: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
b210: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
b220: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
b230: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b240: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
b250: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
b260: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
b270: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  db, SrcList *p, 
b280: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72  int flags){.  Sr
b290: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
b2a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
b2b0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  e;.  assert( db!
b2c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
b2d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
b2e0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
b2f0: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
b300: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
b310: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
b320: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
b330: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
b340: 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  NN(db, nByte );.
b350: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
b360: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b370: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
b380: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
b390: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b3a0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
b3b0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
b3c0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
b3d0: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
b3e0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
b3f0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
b400: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
b410: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
b420: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65   pNewItem->pSche
b430: 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ma = pOldItem->p
b440: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77  Schema;.    pNew
b450: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
b460: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b470: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b480: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
b490: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
b4a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b4b0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b4c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
b4d0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
b4e0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b4f0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  b, pOldItem->zAl
b500: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
b510: 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65  em->fg = pOldIte
b520: 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49  m->fg;.    pNewI
b530: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
b540: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
b550: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b560: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
b570: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
b580: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
b590: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
b5a0: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
b5b0: 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  rn;.    if( pNew
b5c0: 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
b5d0: 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e  edBy ){.      pN
b5e0: 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ewItem->u1.zInde
b5f0: 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44  xedBy = sqlite3D
b600: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
b610: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
b620: 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dBy);.    }.    
b630: 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pNewItem->pIBInd
b640: 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ex = pOldItem->p
b650: 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  IBIndex;.    if(
b660: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73   pNewItem->fg.is
b670: 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
b680: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46   pNewItem->u1.pF
b690: 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20  uncArg = .      
b6a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
b6b0: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
b6c0: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
b6d0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
b6e0: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
b6f0: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
b700: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
b710: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
b720: 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
b730: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
b740: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
b750: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b760: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b770: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
b780: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b790: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
b7a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b7b0: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
b7c0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
b7d0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
b7e0: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
b7f0: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
b800: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
b810: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
b820: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
b830: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
b840: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
b850: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
b860: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
b870: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
b880: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
b890: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b8a0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b8b0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b8c0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b8d0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
b8e0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
b8f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b900: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
b910: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
b920: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b930: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
b940: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
b950: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
b960: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
b970: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
b980: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
b990: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e  rn 0;.  }.  /* N
b9a0: 6f 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ote that because
b9b0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
b9c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
b9d0: 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20  p->a[] is not.  
b9e0: 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61  ** necessarily a
b9f0: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73   power of two, s
ba00: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
ba10: 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20  nd() may not be 
ba20: 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  called.  ** on t
ba30: 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65  he duplicate cre
ba40: 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
ba50: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  ction. */.  for(
ba60: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
ba70: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
ba80: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
ba90: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
baa0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
bab0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
bac0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
bad0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bae0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
baf0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bb00: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
bb10: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
bb20: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
bb30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
bb40: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
bb50: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
bb60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
bb70: 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c  ct *pDup, int fl
bb80: 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  ags){.  Select *
bb90: 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65  pRet = 0;.  Sele
bba0: 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ct *pNext = 0;. 
bbb0: 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26   Select **pp = &
bbc0: 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pRet;.  Select *
bbd0: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  p;..  assert( db
bbe0: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  !=0 );.  for(p=p
bbf0: 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72  Dup; p; p=p->pPr
bc00: 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
bc10: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
bc20: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bc30: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
bc40: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
bc50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65  ) break;.    pNe
bc60: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
bc70: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
bc80: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
bc90: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
bca0: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
bcb0: 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  cListDup(db, p->
bcc0: 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20  pSrc, flags);.  
bcd0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
bce0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bcf0: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
bd00: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
bd10: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
bd20: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
bd30: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
bd40: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
bd50: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
bd60: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bd70: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
bd80: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  );.    pNew->pOr
bd90: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
bda0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
bdb0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
bdc0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70  s);.    pNew->op
bdd0: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e   = p->op;.    pN
bde0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78  ew->pNext = pNex
bdf0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  t;.    pNew->pPr
be00: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ior = 0;.    pNe
be10: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
be20: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
be30: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
be40: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 66 66  ;.    pNew->pOff
be50: 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  set = sqlite3Exp
be60: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66  rDup(db, p->pOff
be70: 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  set, flags);.   
be80: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
be90: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66  0;.    pNew->iOf
bea0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
beb0: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
bec0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
bed0: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
bee0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
bef0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
bf00: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
bf10: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
bf20: 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63      pNew->nSelec
bf30: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
bf40: 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  tRow;.    pNew->
bf50: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
bf60: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20  db, p->pWith);. 
bf70: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
bf80: 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d  SetName(pNew, p-
bf90: 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  >zSelName);.    
bfa0: 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  *pp = pNew;.    
bfb0: 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69  pp = &pNew->pPri
bfc0: 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  or;.    pNext = 
bfd0: 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pNew;.  }..  ret
bfe0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73  urn pRet;.}.#els
bff0: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
c000: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
c010: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
c020: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
c030: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
c040: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
c050: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
c060: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
c070: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
c080: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c090: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
c0a0: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
c0b0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
c0c0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
c0d0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ist..**.** The p
c0e0: 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75  List argument mu
c0f0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 55 4c  st be either NUL
c100: 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74  L or a pointer t
c110: 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a 2a  o an ExprList.**
c120: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
c130: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
c140: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c150: 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20 72 6f  pend().  This ro
c160: 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74  utine.** may not
c170: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
c180: 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61 69 6e   ExprList obtain
c190: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45  ed from sqlite3E
c1a0: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
c1b0: 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73 20 72   Reason:  This r
c1c0: 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20 74  outine assumes t
c1d0: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
c1e0: 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73 74  f slots in pList
c1f0: 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70 6f  ->a[].** is a po
c200: 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54 68 61  wer of two.  Tha
c210: 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 73 71  t is true for sq
c220: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
c230: 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a 2a 2a  end() returns.**
c240: 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65 63 65   but is not nece
c250: 73 73 61 72 69 6c 79 20 74 72 75 65 20 66 72 6f  ssarily true fro
c260: 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  m the return val
c270: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45 78 70  ue of sqlite3Exp
c280: 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a  rListDup()..**.*
c290: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
c2a0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
c2b0: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
c2c0: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
c2d0: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
c2e0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
c2f0: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
c300: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
c310: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
c320: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
c330: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
c340: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
c350: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
c360: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
c370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c380: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c390: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c3a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c3b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
c3c0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
c3d0: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
c3e0: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
c3f0: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
c400: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
c410: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
c420: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
c430: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
c440: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
c450: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c460: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
c470: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c480: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
c490: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
c4a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c4b0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
c4c0: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
c4d0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
c4e0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
c4f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
c500: 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d  ->nExpr = 0;.  }
c510: 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d  else if( (pList-
c520: 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d  >nExpr & (pList-
c530: 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b  >nExpr-1))==0 ){
c540: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
c550: 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
c560: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
c570: 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20  (db, pList, .   
c580: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
c590: 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69 73  (*pList)+(2*pLis
c5a0: 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a 73 69  t->nExpr - 1)*si
c5b0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c5c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
c5d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
c5e0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
c5f0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
c600: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
c610: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
c620: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73  >nExpr++];.  ass
c630: 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74  ert( offsetof(st
c640: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
c650: 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f  em,zName)==sizeo
c660: 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20  f(pItem->pExpr) 
c670: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
c680: 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70  setof(struct Exp
c690: 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70 72  rList_item,pExpr
c6a0: 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  )==0 );.  memset
c6b0: 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30  (&pItem->zName,0
c6c0: 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d  ,sizeof(*pItem)-
c6d0: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
c6e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e  ExprList_item,zN
c6f0: 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  ame));.  pItem->
c700: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
c710: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
c720: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
c730: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
c740: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
c750: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
c760: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
c770: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
c780: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
c790: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
c7a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
c7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e  }../*.** pColumn
c7c0: 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d  s and pExpr form
c7d0: 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e   a vector assign
c7e0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61  ment which is pa
c7f0: 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a  rt of the SET.**
c800: 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50   clause of an UP
c810: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  DATE statement. 
c820: 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
c830: 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29  *        (a,b,c)
c840: 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c   = (expr1,expr2,
c850: 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20  expr3).** Or:   
c860: 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45   (a,b,c) = (SELE
c870: 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e  CT x,y,z FROM ..
c880: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ..).**.** For ea
c890: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76  ch term of the v
c8a0: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
c8b0: 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74  , append new ent
c8c0: 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65  ries to the.** e
c8d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
c8e0: 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61  List.  In the ca
c8f0: 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79  se of a subquery
c900: 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70   on the RHS, app
c910: 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54  end.** TK_SELECT
c920: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
c930: 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ons..*/.ExprList
c940: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
c950: 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20  tAppendVector(. 
c960: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c970: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c980: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c990: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c9a0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
c9b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
c9c0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
c9d0: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
c9e0: 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20  olumns,      /* 
c9f0: 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66  List of names of
ca00: 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69   LHS of the assi
ca10: 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  gnment */.  Expr
ca20: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
ca30: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70     /* Vector exp
ca40: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
ca50: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
ca60: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
ca70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ca80: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b  se->db;.  int n;
ca90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
caa0: 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f  iFirst = pList ?
cab0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
cac0: 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73  0;.  /* pColumns
cad0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c   can only be NUL
cae0: 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20  L due to an OOM 
caf0: 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20  but an OOM will 
cb00: 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78  cause an.  ** ex
cb10: 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  it prior to this
cb20: 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69   routine being i
cb30: 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20  nvoked */.  if( 
cb40: 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d  NEVER(pColumns==
cb50: 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72  0) ) goto vector
cb60: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
cb70: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
cb80: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
cb90: 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  nd_error;..  /* 
cba0: 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
cbb0: 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20  vector, then we 
cbc0: 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  can immediately 
cbd0: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
cbe0: 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  t .  ** the size
cbf0: 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64 20   of the RHS and 
cc00: 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20  LHS match.  But 
cc10: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  if the RHS is a 
cc20: 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69  SELECT, .  ** wi
cc30: 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e  ldcards ("*") in
cc40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
cc50: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75  of the SELECT mu
cc60: 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
cc70: 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61  efore.  ** we ca
cc80: 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68  n do the size ch
cc90: 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68  eck, so defer th
cca0: 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74  e size check unt
ccb0: 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
ccc0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
ccd0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  Expr->op!=TK_SEL
cce0: 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d  ECT && pColumns-
ccf0: 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33  >nId!=(n=sqlite3
cd00: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
cd10: 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71  Expr)) ){.    sq
cd20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
cd30: 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
cd40: 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
cd50: 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
cd60: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75             pColu
cd70: 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20  mns->nId, n);.  
cd80: 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70    goto vector_ap
cd90: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  pend_error;.  }.
cda0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
cdb0: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b  olumns->nId; i++
cdc0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75  ){.    Expr *pSu
cdd0: 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  bExpr = sqlite3E
cde0: 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c  xprForVectorFiel
cdf0: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
ce00: 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   i);.    pList =
ce10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ce20: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
ce30: 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b  List, pSubExpr);
ce40: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
ce50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ce60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46  pList->nExpr==iF
ce70: 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20  irst+i+1 );.    
ce80: 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
ce90: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
cea0: 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69   = pColumns->a[i
ceb0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ].zName;.      p
cec0: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
ced0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
cee0: 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   }..  if( !db->m
cef0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70  allocFailed && p
cf00: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
cf10: 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70 4c  ECT && ALWAYS(pL
cf20: 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 45  ist!=0) ){.    E
cf30: 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70 4c  xpr *pFirst = pL
cf40: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70  ist->a[iFirst].p
cf50: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
cf60: 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a 20  ( pFirst!=0 );. 
cf70: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73     assert( pFirs
cf80: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  t->op==TK_SELECT
cf90: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
cfa0: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
cfb0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
cfc0: 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20  nt in pRight so 
cfd0: 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  it will be delet
cfe0: 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73  ed when.    ** s
cff0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
d000: 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lete() is called
d010: 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e   */.    pFirst->
d020: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a  pRight = pExpr;.
d030: 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a      pExpr = 0;..
d040: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
d050: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d060: 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f  LHS in iTable so
d070: 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 65   that we can che
d080: 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ck that.    ** t
d090: 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73  he RHS and LHS s
d0a0: 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e  izes match durin
d0b0: 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
d0c0: 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  n. */.    pFirst
d0d0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75  ->iTable = pColu
d0e0: 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76  mns->nId;.  }..v
d0f0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
d100: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  or:.  sqlite3Exp
d110: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
d120: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  r);.  sqlite3IdL
d130: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
d140: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72  olumns);.  retur
d150: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
d160: 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f  * Set the sort o
d170: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73  rder for the las
d180: 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65  t element on the
d190: 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e   given ExprList.
d1a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d1b0: 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
d1c0: 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70  rder(ExprList *p
d1d0: 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72  , int iSortOrder
d1e0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
d1f0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
d200: 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45  ( SQLITE_SO_UNDE
d210: 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54  FINED<0 && SQLIT
d220: 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53  E_SO_ASC>=0 && S
d230: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20  QLITE_SO_DESC>0 
d240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d250: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28  nExpr>0 );.  if(
d260: 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b   iSortOrder<0 ){
d270: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d280: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
d290: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
d2a0: 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65  SO_ASC );.    re
d2b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61  turn;.  }.  p->a
d2c0: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
d2d0: 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f  tOrder = (u8)iSo
d2e0: 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rtOrder;.}../*.*
d2f0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
d300: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
d310: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
d320: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
d330: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
d340: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
d350: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
d360: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
d370: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
d380: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
d390: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
d3a0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
d3b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
d3c0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
d3d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
d3e0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
d3f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d400: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
d410: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d420: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
d430: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d440: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
d450: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
d460: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
d470: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
d480: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
d490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
d4a0: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
d4b0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d4d0: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
d4e0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
d4f0: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
d500: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
d510: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
d520: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
d530: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d540: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
d550: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
d560: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d570: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
d580: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
d590: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d5a0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
d5b0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
d5c0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
d5d0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
d5e0: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
d5f0: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
d600: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
d610: 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74   dequote ) sqlit
d620: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
d630: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  >zName);.  }.}..
d640: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
d650: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e  prList.a[].zSpan
d660: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
d670: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
d680: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
d690: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
d6a0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
d6b0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
d6c0: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
d6d0: 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e  rror.  But pSpan
d6e0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
d6f0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
d700: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
d710: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
d720: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
d730: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
d740: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
d750: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
d760: 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Span(.  Parse *p
d770: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d780: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d790: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
d7a0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
d7b0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
d7c0: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
d7d0: 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20  . */.  ExprSpan 
d7e0: 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f  *pSpan         /
d7f0: 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65  * The span to be
d800: 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73   added */.){.  s
d810: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d820: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
d830: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
d840: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
d850: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
d860: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
d870: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
d880: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
d890: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
d8a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
d8b0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
d8c0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
d8d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
d8e0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53  pItem->pExpr==pS
d8f0: 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  pan->pExpr );.  
d900: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d910: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
d920: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
d930: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
d940: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
d950: 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c  *)pSpan->zStart,
d960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
d990: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
d9a0: 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a  zStart));.  }.}.
d9b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
d9c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45  pression list pE
d9d0: 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  List contains mo
d9e0: 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65  re than iLimit e
d9f0: 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76  lements,.** leav
da00: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
da10: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
da20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
da30: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
da40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
da50: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
da60: 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63  EList,.  const c
da70: 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a  har *zObject.){.
da80: 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73    int mx = pPars
da90: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
daa0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
dab0: 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  N];.  testcase( 
dac0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
dad0: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20  ->nExpr==mx );. 
dae0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
daf0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
db00: 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66  pr==mx+1 );.  if
db10: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
db20: 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a  st->nExpr>mx ){.
db30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
db40: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
db50: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
db60: 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a   %s", zObject);.
db70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
db80: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
db90: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
dba0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
dbb0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78  NOINLINE void ex
dbc0: 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73  prListDeleteNN(s
dbd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
dbe0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
dbf0: 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e  int i = pList->n
dc00: 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45  Expr;.  struct E
dc10: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
dc20: 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b  tem =  pList->a;
dc30: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
dc40: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64  ->nExpr>0 );.  d
dc50: 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  o{.    sqlite3Ex
dc60: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  prDelete(db, pIt
dc70: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
dc80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
dc90: 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
dca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
dcb0: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
dcc0: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b  pan);.    pItem+
dcd0: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69  +;.  }while( --i
dce0: 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  >0 );.  sqlite3D
dcf0: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73  bFreeNN(db, pLis
dd00: 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  t);.}.void sqlit
dd10: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
dd20: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
dd30: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
dd40: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 65 78    if( pList ) ex
dd50: 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64  prListDeleteNN(d
dd60: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
dd70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
dd80: 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c  itwise-OR of all
dd90: 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c   Expr.flags fiel
dda0: 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a  ds in the given.
ddb0: 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  ** ExprList..*/.
ddc0: 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c  u32 sqlite3ExprL
ddd0: 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45  istFlags(const E
dde0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
ddf0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20  .  int i;.  u32 
de00: 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  m = 0;.  if( pLi
de10: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
de20: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
de30: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
de40: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
de50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
de60: 0a 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20  .       assert( 
de70: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
de80: 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66     m |= pExpr->f
de90: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lags;.    }.  }.
dea0: 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
deb0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53  *.** This is a S
dec0: 45 4c 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62  ELECT-node callb
ded0: 61 63 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72  ack for the expr
dee0: 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68  ession walker th
def0: 61 74 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61  at.** always "fa
df00: 69 6c 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22  ils".  By "fail"
df10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77   in this case, w
df20: 65 20 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57  e mean set.** pW
df30: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
df40: 7a 65 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a  zero and abort..
df50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62  **.** This callb
df60: 61 63 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d  ack is used by m
df70: 75 6c 74 69 70 6c 65 20 65 78 70 72 65 73 73 69  ultiple expressi
df80: 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69  on walkers..*/.i
df90: 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
dfa0: 57 61 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20  WalkFail(Walker 
dfb0: 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
dfc0: 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
dfd0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
dfe0: 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b  otUsed);.  pWalk
dff0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
e000: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
e010: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  t;.}../*.** Thes
e020: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
e030: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
e040: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
e050: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
e060: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
e070: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
e080: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
e090: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
e0a0: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
e0b0: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
e0c0: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
e0d0: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
e0e0: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
e0f0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
e100: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
e110: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
e120: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
e130: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
e140: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
e150: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
e160: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e170: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
e180: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
e190: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
e1a0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
e1b0: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
e1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
e1d0: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
e1e0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
e1f0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
e200: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
e210: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
e220: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
e230: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
e240: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
e250: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
e260: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
e270: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
e280: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
e290: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
e2a0: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
e2b0: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
e2c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
e2d0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
e2e0: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
e2f0: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
e300: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
e310: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
e320: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
e330: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
e340: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
e350: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
e360: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
e370: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
e380: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
e390: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
e3a0: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
e3b0: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
e3c0: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
e3d0: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
e3e0: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
e3f0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
e400: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
e410: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e420: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
e430: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
e440: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
e450: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
e460: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
e470: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
e480: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
e490: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
e4a0: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
e4b0: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
e4c0: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
e4d0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
e4e0: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
e4f0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
e500: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
e510: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
e520: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
e530: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
e540: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
e550: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
e560: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
e570: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
e580: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
e590: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
e5a0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
e5b0: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
e5c0: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
e5d0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
e5e0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
e5f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e600: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
e610: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
e620: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
e630: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e640: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
e650: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
e660: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
e670: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
e680: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
e690: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
e6a0: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
e6b0: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
e6c0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
e6d0: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
e6e0: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
e6f0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
e700: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
e710: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
e720: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
e730: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
e740: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
e750: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
e760: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
e770: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
e780: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
e790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
e7a0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e7b0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e7c0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e7d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e7e0: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
e7f0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
e800: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
e810: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
e820: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
e830: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e840: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
e850: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e860: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
e870: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
e880: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e890: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
e8a0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e8b0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e8c0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
e8d0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
e8e0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
e8f0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
e900: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
e910: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e920: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
e930: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
e940: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
e950: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
e960: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 20 20 74 65  LL_ROW:.      te
e970: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
e980: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
e990: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
e9a0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
e9b0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
e9c0: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
e9d0: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
e9e0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
e9f0: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
ea00: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
ea10: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
ea20: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
ea30: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
ea40: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
ea50: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
ea60: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
ea70: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
ea80: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
ea90: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
eaa0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
eab0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
eac0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
ead0: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
eae0: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
eaf0: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
eb00: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
eb10: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
eb20: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
eb30: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
eb40: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
eb50: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
eb60: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
eb70: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
eb80: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
eb90: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
eba0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
ebb0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
ebc0: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
ebd0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
ebe0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
ebf0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
ec00: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
ec10: 63 74 57 61 6c 6b 46 61 69 6c 20 77 69 6c 6c 20  ctWalkFail will 
ec20: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
ec30: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
ec40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
ec50: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65   ); /* sqlite3Se
ec60: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 20 77 69 6c  lectWalkFail wil
ec70: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
ec80: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
ec90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
eca0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73  tatic int exprIs
ecb0: 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69  Const(Expr *p, i
ecc0: 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74  nt initFlag, int
ecd0: 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72   iCur){.  Walker
ece0: 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20   w;.  w.eCode = 
ecf0: 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45  initFlag;.  w.xE
ed00: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
ed10: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
ed20: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
ed30: 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53  lback = sqlite3S
ed40: 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23  electWalkFail;.#
ed50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
ed60: 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  UG.  w.xSelectCa
ed70: 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65  llback2 = sqlite
ed80: 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72  3SelectWalkAsser
ed90: 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e 75  t2;.#endif.  w.u
eda0: 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  .iCur = iCur;.  
edb0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
edc0: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
edd0: 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
ede0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
edf0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
ee00: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
ee10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ee20: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
ee30: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
ee40: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
ee50: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a  function calls..
ee60: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
ee70: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
ee80: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
ee90: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
eea0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
eeb0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
eec0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
eed0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
eee0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
eef0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
ef00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ef10: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
ef20: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
ef30: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
ef40: 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1, 0);.}../*.** 
ef50: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
ef60: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
ef70: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
ef80: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
ef90: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
efa0: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
efb0: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
efc0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
efd0: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
efe0: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
eff0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
f000: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
f010: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
f020: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
f030: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
f040: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f050: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
f060: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
f070: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
f080: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 0);.}../*.** W
f090: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
f0a0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
f0b0: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
f0c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
f0d0: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e  nstant.** for an
f0e0: 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  y single row of 
f0f0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
f100: 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20  ursor iCur.  In 
f110: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
f120: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  .** expression m
f130: 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f  ust not refer to
f140: 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   any non-determi
f150: 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20  nistic function 
f160: 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65  nor any.** table
f170: 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72   other than iCur
f180: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f190: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
f1a0: 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ant(Expr *p, int
f1b0: 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e   iCur){.  return
f1c0: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
f1d0: 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a  3, iCur);.}.../*
f1e0: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
f1f0: 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
f200: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  sed by sqlite3Ex
f210: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
f220: 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74  oupBy()..*/.stat
f230: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
f240: 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
f250: 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  By(Walker *pWalk
f260: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
f270: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  {.  ExprList *pG
f280: 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72  roupBy = pWalker
f290: 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20  ->u.pGroupBy;.  
f2a0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65  int i;..  /* Che
f2b0: 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 69  ck if pExpr is i
f2c0: 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20  dentical to any 
f2d0: 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49  GROUP BY term. I
f2e0: 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20  f so, consider. 
f2f0: 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e   ** it constant.
f300: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
f310: 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
f320: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
f330: 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d  r *p = pGroupBy-
f340: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
f350: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f360: 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
f370: 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20  , p, -1)<2 ){.  
f380: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
f390: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
f3a0: 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d  CollSeq(pWalker-
f3b0: 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  >pParse, p);.   
f3c0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
f3d0: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
f3e0: 6d 70 28 22 42 49 4e 41 52 59 22 2c 20 70 43 6f  mp("BINARY", pCo
f3f0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ll->zName)==0 ){
f400: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f410: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
f420: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
f430: 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78 70  /* Check if pExp
f440: 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
f450: 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64  t. If so, consid
f460: 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20  er it variable. 
f470: 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
f480: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f490: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
f4a0: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
f4b0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
f4c0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
f4d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70   }..  return exp
f4e0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
f4f0: 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b  pWalker, pExpr);
f500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  .}../*.** Walk t
f510: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
f520: 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ee passed as the
f530: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
f540: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
f550: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
f560: 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65  ssion consists e
f570: 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74  ntirely of const
f580: 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f  ants or copies o
f590: 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70  f terms .** in p
f5a0: 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72  GroupBy that sor
f5b0: 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41 52  t with the BINAR
f5c0: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  Y collation sequ
f5d0: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ence..**.** This
f5e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
f5f0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
f600: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   a term of the H
f610: 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e  AVING clause can
f620: 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20  .** be promoted 
f630: 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  into the WHERE c
f640: 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72  lause.  In order
f650: 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d   for such a prom
f660: 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a  otion to work,.*
f670: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
f680: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
f690: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68   term must be th
f6a0: 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d  e same for all m
f6b0: 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22  embers of.** a "
f6c0: 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71  group".  The req
f6d0: 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
f6e0: 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20  e GROUP BY term 
f6f0: 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a  must be BINARY.*
f700: 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e  * assumes that n
f710: 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e  o other collatin
f720: 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  g sequence will 
f730: 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61  have a finer-gra
f740: 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  ined.** grouping
f750: 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49   than binary.  I
f760: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41  n other words (A
f770: 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72  =B COLLATE binar
f780: 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d  y) implies.** A=
f790: 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72  B in every other
f7a0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
f7b0: 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69 72  nce.  The requir
f7c0: 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a  ement that the.*
f7d0: 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42 49  * GROUP BY be BI
f7e0: 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65 72  NARY is stricter
f7f0: 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e   than necessary.
f800: 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20    It would also 
f810: 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f  work.** to promo
f820: 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  te HAVING clause
f830: 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73  s that use the s
f840: 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ame alternative 
f850: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
f860: 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f  uence as the GRO
f870: 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20  UP BY term, but 
f880: 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61 72  that is much har
f890: 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a  der to check,.**
f8a0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
f8b0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
f8c0: 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61   are uncommon, a
f8d0: 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20  nd this is only 
f8e0: 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  an.** optimizati
f8f0: 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74  on, so we take t
f900: 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74 20  he easy way out 
f910: 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69  and simply requi
f920: 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20  re the.** GROUP 
f930: 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42 49  BY to use the BI
f940: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73  NARY collating s
f950: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20  equence..*/.int 
f960: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f970: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50  stantOrGroupBy(P
f980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
f990: 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  pr *p, ExprList 
f9a0: 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61  *pGroupBy){.  Wa
f9b0: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64  lker w;.  w.eCod
f9c0: 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
f9d0: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
f9e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  odeIsConstantOrG
f9f0: 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c  roupBy;.  w.xSel
fa00: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
fa10: 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79 20  .  w.u.pGroupBy 
fa20: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  = pGroupBy;.  w.
fa30: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
fa40: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
fa50: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
fa60: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
fa70: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
fa80: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
fa90: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
faa0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
fab0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
fac0: 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63   or a function c
fad0: 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e  all with constan
fae0: 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
faf0: 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68  turn and 0 if th
fb00: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76  ere.** are any v
fb10: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
fb20: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
fb30: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
fb40: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
fb50: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
fb60: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
fb70: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
fb80: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
fb90: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
fba0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
fbb0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
fbc0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
fbd0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
fbe0: 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73  n(Expr *p, u8 is
fbf0: 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28  Init){.  assert(
fc00: 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73   isInit==0 || is
fc10: 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Init==1 );.  ret
fc20: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fc30: 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b  p, 4+isInit, 0);
fc40: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
fc50: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
fc60: 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  HINTS./*.** Walk
fc70: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
fc80: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
fc90: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
fca0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73   contains a.** s
fcb0: 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20  ubquery of some 
fcc0: 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20  kind.  Return 0 
fcd0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
fce0: 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69  subqueries..*/.i
fcf0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
fd00: 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45  ntainsSubquery(E
fd10: 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65  xpr *p){.  Walke
fd20: 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
fd30: 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   1;.  w.xExprCal
fd40: 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
fd50: 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
fd60: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
fd70: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fd80: 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66  WalkFail;.#ifdef
fd90: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
fda0: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
fdb0: 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  k2 = sqlite3Sele
fdc0: 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23  ctWalkAssert2;.#
fdd0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57  endif.  sqlite3W
fde0: 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
fdf0: 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
fe00: 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ==0;.}.#endif../
fe10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
fe20: 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61  ession p codes a
fe30: 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65   constant intege
fe40: 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20  r that is small 
fe50: 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74  enough.** to fit
fe60: 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
fe70: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61  eger, return 1 a
fe80: 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  nd put the value
fe90: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a   of the integer.
fea0: 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20  ** in *pValue.  
feb0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
fec0: 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  n is not an inte
fed0: 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20  ger or if it is 
fee0: 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69  too big.** to fi
fef0: 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  t in a signed 32
ff00: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
ff10: 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65  turn 0 and leave
ff20: 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67   *pValue unchang
ff30: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ff40: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
ff50: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56  Expr *p, int *pV
ff60: 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  alue){.  int rc 
ff70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
ff80: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
ff90: 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
ffa0: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d  following on OOM
ffb0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   */..  /* If an 
ffc0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
ffd0: 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c   integer literal
ffe0: 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20   that fits in a 
fff0: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20  signed 32-bit.  
10000 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  ** integer, then
10010 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
10020 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20   flag will have 
10030 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74  already been set
10040 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
10050 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op!=TK_INTEGER 
10060 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  || (p->flags & E
10070 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20  P_IntValue)!=0. 
10080 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
10090 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
100a0 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d  u.zToken, &rc)==
100b0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66  0 );..  if( p->f
100c0 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
100d0 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75  ue ){.    *pValu
100e0 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b  e = p->u.iValue;
100f0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10100 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e   }.  switch( p->
10110 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
10120 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
10130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
10140 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
10150 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
10160 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10170 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
10180 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
10190 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
101a0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
101b0 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
101c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
101d0 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33  rt( v!=(-2147483
101e0 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  647-1) );.      
101f0 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
10200 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
10210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10220 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
10230 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
10240 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10260 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69  FALSE if there i
10270 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
10280 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10290 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  can be NULL..**.
102a0 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
102b0 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55  sion might be NU
102c0 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  LL or if the exp
102d0 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63  ression is too c
102e0 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c  omplex.** to tel
102f0 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  l return TRUE.  
10300 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10310 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ine is used as a
10320 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
10330 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c  to skip OP_IsNul
10340 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65  l opcodes.** whe
10350 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  n we know that a
10360 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
10370 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61   NULL.  Hence, a
10380 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a   false positive.
10390 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52  ** (returning TR
103a0 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20  UE when in fact 
103b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
103c0 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c  an never be NULL
103d0 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  ) might.** be a 
103e0 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63  small performanc
103f0 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68  e hit but is oth
10400 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e  erwise harmless.
10410 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a    On the other.*
10420 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20  * hand, a false 
10430 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e  negative (return
10440 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74  ing FALSE when t
10450 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  he result could 
10460 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c  be NULL).** will
10470 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
10480 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  n an incorrect a
10490 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20  nswer.  So when 
104a0 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
104b0 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74  .** TRUE..*/.int
104c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
104d0 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72  eNull(const Expr
104e0 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20   *p){.  u8 op;. 
104f0 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
10500 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
10510 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
10520 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
10530 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
10540 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
10550 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
10560 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
10570 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
10580 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
10590 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
105a0 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
105b0 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
105c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
105d0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
105e0 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  MN:.      return
105f0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
10600 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c  (p, EP_CanBeNull
10610 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
10620 20 20 70 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20    p->pTab==0 || 
10630 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
10640 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
10650 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   on expression *
10660 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  /.             (
10670 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  p->iColumn>=0 &&
10680 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   p->pTab->aCol[p
10690 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  ->iColumn].notNu
106a0 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61  ll==0);.    defa
106b0 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
106c0 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
106d0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
106e0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
106f0 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74  ssion is a const
10700 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ant which would 
10710 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  be.** unchanged 
10720 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77  by OP_Affinity w
10730 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79  ith the affinity
10740 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
10750 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
10760 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10770 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
10780 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
10790 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65   OP_Affinity ope
107a0 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ration.** can be
107b0 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20   omitted.  When 
107c0 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20  in doubt return 
107d0 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20  FALSE.  A false 
107e0 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68  negative.** is h
107f0 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73  armless.  A fals
10800 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65  e positive, howe
10810 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20  ver, can result 
10820 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20  in the wrong.** 
10830 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  answer..*/.int s
10840 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
10850 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
10860 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63  const Expr *p, c
10870 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f  har aff){.  u8 o
10880 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51  p;.  if( aff==SQ
10890 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20  LITE_AFF_BLOB ) 
108a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c  return 1;.  whil
108b0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
108c0 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
108d0 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
108e0 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
108f0 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
10900 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
10910 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
10920 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
10930 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
10940 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
10950 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
10960 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
10970 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
10980 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
10990 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
109a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
109b0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
109c0 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  L || aff==SQLITE
109d0 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
109e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
109f0 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
10a00 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
10a10 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
10a20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
10a30 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LOB: {.      ret
10a40 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
10a50 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
10a60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
10a70 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b   p->iTable>=0 );
10a80 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65    /* p cannot be
10a90 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b   part of a CHECK
10aa0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
10ab0 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
10ac0 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20  Column<0.       
10ad0 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
10ae0 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
10af0 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
10b00 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20  F_NUMERIC);.    
10b10 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
10b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10b40 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10b50 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
10b60 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
10b70 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
10b80 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
10b90 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
10ba0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
10bb0 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
10bc0 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
10bd0 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
10be0 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
10bf0 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
10c00 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
10c10 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
10c20 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
10c30 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
10c40 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68  ../*.** pX is th
10c50 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f  e RHS of an IN o
10c60 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20  perator.  If pX 
10c70 69 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  is a SELECT stat
10c80 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63  ement .** that c
10c90 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64  an be simplified
10ca0 20 74 6f 20 61 20 64 69 72 65 63 74 20 74 61 62   to a direct tab
10cb0 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20  le access, then 
10cc0 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
10cd0 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43  ter to the SELEC
10ce0 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66  T statement.  If
10cf0 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c   pX is not a SEL
10d00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
10d10 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45  * or if the SELE
10d20 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65  CT statement nee
10d30 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73  ds to be manifes
10d40 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ted into a trans
10d50 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74  ient.** table, t
10d60 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  hen return NULL.
10d70 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
10d80 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10d90 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
10da0 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
10db0 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20  Opt(Expr *pX){. 
10dc0 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72   Select *p;.  Sr
10dd0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
10de0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
10df0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
10e00 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
10e10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
10e20 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
10e30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  ) ) return 0;  /
10e40 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79  * Not a subquery
10e50 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61   */.  if( ExprHa
10e60 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
10e70 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29 20 72  _VarSelect)  ) r
10e80 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
10e90 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a  related subq */.
10ea0 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c    p = pX->x.pSel
10eb0 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  ect;.  if( p->pP
10ec0 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ee0 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   Not a compound 
10ef0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
10f00 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
10f10 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
10f20 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20  gregate) ){.    
10f30 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
10f40 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
10f50 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
10f60 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
10f70 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
10f80 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
10f90 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
10fa0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
10fb0 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
10fc0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
10fd0 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  No DISTINCT keyw
10fe0 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65  ord and no aggre
10ff0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
11000 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  /.  }.  assert( 
11010 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
11020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11030 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  * Has no GROUP B
11040 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  Y clause */.  if
11050 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  ( p->pLimit ) re
11060 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
11070 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c       /* Has no L
11080 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
11090 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
110a0 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  set==0 );       
110b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49          /* No LI
110c0 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46  MIT means no OFF
110d0 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  SET */.  if( p->
110e0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
110f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11100 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20  /* Has no WHERE 
11110 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63  clause */.  pSrc
11120 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
11130 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
11140 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
11150 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
11170 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d  gle term in FROM
11180 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
11190 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
111a0 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
111b0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e      /* FROM is n
111c0 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  ot a subquery or
111d0 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20   view */.  pTab 
111e0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
111f0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  b;.  assert( pTa
11200 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
11210 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
11220 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
11230 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
11240 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
11250 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
11260 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
11270 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
11280 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
11290 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
112a0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
112b0 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
112c0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f  pEList!=0 );.  /
112d0 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73  * All SELECT res
112e0 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c  ults must be col
112f0 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  umns. */.  for(i
11300 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
11310 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
11320 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69  xpr *pRes = pELi
11330 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
11340 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70      if( pRes->op
11350 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
11360 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65  turn 0;.    asse
11370 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65  rt( pRes->iTable
11380 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ==pSrc->a[0].iCu
11390 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  rsor );  /* Not 
113a0 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
113b0 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72  query */.  }.  r
113c0 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
113d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
113e0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
113f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11400 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
11410 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11420 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  hat checks the l
11430 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
11440 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69  of index table i
11450 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  Cur to see if.**
11460 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79   it contains any
11470 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20   NULL entries.  
11480 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74  Cause the regist
11490 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c  er at regHasNull
114a0 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f   to be set.** to
114b0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
114c0 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69  e if iCur contai
114d0 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61  ns no NULLs.  Ca
114e0 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67  use register reg
114f0 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65  HasNull.** to be
11500 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
11510 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  iCur contains on
11520 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
11530 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
11540 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74   void sqlite3Set
11550 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65  HasNullFlag(Vdbe
11560 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69   *v, int iCur, i
11570 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a  nt regHasNull){.
11580 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73    int addr1;.  s
11590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
115a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
115b0 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
115c0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
115d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
115e0 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b  P_Rewind, iCur);
115f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11600 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11610 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
11620 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67  mn, iCur, 0, reg
11630 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  HasNull);.  sqli
11640 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
11650 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
11660 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ARG);.  VdbeComm
11670 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65  ent((v, "first_e
11680 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43  ntry_in(%d)", iC
11690 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ur));.  sqlite3V
116a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
116b0 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ddr1);.}.#endif.
116c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
116d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
116e0 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
116f0 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  t is an IN opera
11700 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20  tor with a list 
11710 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
11720 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68   on the .** righ
11730 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65  t-hand side.  Re
11740 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61  turn TRUE if tha
11750 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61  t list is consta
11760 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
11770 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  t sqlite3InRhsIs
11780 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
11790 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48  In){.  Expr *pLH
117a0 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  S;.  int res;.  
117b0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
117c0 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50  Property(pIn, EP
117d0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
117e0 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65   pLHS = pIn->pLe
117f0 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  ft;.  pIn->pLeft
11800 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71   = 0;.  res = sq
11810 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
11820 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d  ant(pIn);.  pIn-
11830 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20  >pLeft = pLHS;. 
11840 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23   return res;.}.#
11850 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
11860 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
11870 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
11880 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11890 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
118a0 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
118b0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
118c0 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
118d0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
118e0 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
118f0 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
11900 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
11910 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
11920 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
11930 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
11940 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
11950 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
11960 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
11970 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
11980 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
11990 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
119a0 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
119b0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
119c0 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
119d0 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
119e0 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
119f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
11a00 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
11a10 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
11a20 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48  t that is the RH
11a30 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
11a40 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e  ator.** and pX->
11a50 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
11a60 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
11a70 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  at cursor..**.**
11a80 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
11a90 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
11aa0 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
11ab0 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
11ac0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
11ad0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
11ae0 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75  ID      - The cu
11af0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
11b00 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61  on a database ta
11b10 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
11b20 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20  EX_INDEX_ASC  - 
11b30 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
11b40 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65  pened on an asce
11b50 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
11b60 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
11b70 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73  _DESC - The curs
11b80 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
11b90 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
11ba0 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
11bb0 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20  EX_EPH        - 
11bc0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
11bd0 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
11be0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
11bf0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11c00 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
11c10 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
11c20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
11c30 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20  NDEX_NOOP       
11c40 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20  - No cursor was 
11c50 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20  allocated.  The 
11c60 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
11c70 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
11c90 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
11ca0 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
11cb0 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  arisons..**.** A
11cc0 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
11cd0 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  e might be used 
11ce0 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65  if the RHS expre
11cf0 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69  ssion pX is a si
11d00 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79  mple.** subquery
11d10 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20   such as:.**.** 
11d20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
11d30 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e  mn1>, <column2>.
11d40 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  .. FROM <table>.
11d50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
11d60 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
11d70 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
11d80 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
11d90 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
11da0 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
11db0 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
11dc0 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
11dd0 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
11de0 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
11df0 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
11e00 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
11e10 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
11e20 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
11e30 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
11e40 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
11e50 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
11e60 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f  in exactly one o
11e70 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e  f the bits.** IN
11e80 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
11e90 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  P or IN_INDEX_LO
11ea0 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20  OP.  If inFlags 
11eb0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49  contains.** IN_I
11ec0 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c  NDEX_MEMBERSHIP,
11ed0 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61   then the genera
11ee0 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ted table will b
11ef0 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20  e used for a.** 
11f00 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20  fast membership 
11f10 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20  test.  When the 
11f20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69  IN_INDEX_LOOP bi
11f30 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a  t is set, the.**
11f40 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62   IN index will b
11f50 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f  e used to loop o
11f60 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
11f70 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
11f80 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  .** IN operator.
11f90 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
11fa0 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65  NDEX_LOOP is use
11fb0 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
11fc0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
11fd0 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
11fe0 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
11ff0 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62  bers) then the b
12000 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63  -tree must not c
12010 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65  ontain duplicate
12020 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d  s..** An epherem
12030 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  al table must be
12040 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65   used unless the
12050 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
12060 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
12070 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65  .** to be unique
12080 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73   - either becaus
12090 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47  e it is an INTEG
120a0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
120b0 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e  r due to.** a UN
120c0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
120d0 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  or index..**.** 
120e0 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  When IN_INDEX_ME
120f0 4d 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64  MBERSHIP is used
12100 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
12110 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
12120 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
12130 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29  embership tests)
12140 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d   then an epherem
12150 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
12160 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
12170 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20   <columns> is a 
12180 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50  single INTEGER P
12190 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
121a0 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65  n or an .** inde
121b0 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77  x can be found w
121c0 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
121d0 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69  d <columns> as i
121e0 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a  ts left-most..**
121f0 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e  .** If the IN_IN
12200 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20  DEX_NOOP_OK and 
12210 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
12220 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74  HIP are both set
12230 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52   and.** if the R
12240 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
12250 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
12260 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
12270 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
12280 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69  utine might deci
12290 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67  de that creating
122a0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d   an ephemeral b-
122b0 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73  tree for members
122c0 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69  hip.** testing i
122d0 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20  s too expensive 
122e0 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e  and return IN_IN
122f0 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68  DEX_NOOP.  In th
12300 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20  at case, the.** 
12310 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
12320 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74  should implement
12330 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12340 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63   using a sequenc
12350 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65  e.** of Eq or Ne
12360 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
12370 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ations..**.** Wh
12380 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
12390 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
123a0 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
123b0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
123c0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  nction.** might 
123d0 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65  need to know whe
123e0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
123f0 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20  RHS side of the 
12400 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63  IN operator.** c
12410 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20  ontains a NULL. 
12420 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c   If prRhsHasNull
12430 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70   is not a NULL p
12440 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69  ointer and .** i
12450 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63  f there is any c
12460 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
12470 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61  ...) might conta
12480 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  in a NULL value 
12490 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74  at.** runtime, t
124a0 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69  hen a register i
124b0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
124c0 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
124d0 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ber written.** t
124e0 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e  o *prRhsHasNull.
124f0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
12500 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
12510 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
12520 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
12530 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  then *prRhsHasNu
12540 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ll is left uncha
12550 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
12560 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
12570 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
12580 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
12590 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  n *prRhsHasNull,
125a0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
125b0 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73  ue in that regis
125c0 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ter will be NULL
125d0 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
125e0 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
125f0 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  ore.** NULL valu
12600 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20  es, and it will 
12610 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c  be some non-NULL
12620 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d   value if the b-
12630 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  tree contains no
12640 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  .** NULL values.
12650 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69  .**.** If the ai
12660 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20 69 73  Map parameter is
12670 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75   not NULL, it mu
12680 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61  st point to an a
12690 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  rray containing.
126a0 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66  ** one element f
126b0 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72  or each column r
126c0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
126d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
126e0 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66  on the RHS.** of
126f0 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65   the IN(...) ope
12700 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20  rator. The i'th 
12710 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72 72  entry of the arr
12720 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ay is populated 
12730 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73  with the.** offs
12740 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  et of the index 
12750 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63  column that matc
12760 68 65 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c  hes the i'th col
12770 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  umn returned by 
12780 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46  the.** SELECT. F
12790 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
127a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
127b0 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78  d selected index
127c0 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f   are:.**.**   (?
127d0 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54  ,?,?) IN (SELECT
127e0 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31   a, b, c FROM t1
127f0 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  ).**   CREATE IN
12800 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20  DEX i1 ON t1(b, 
12810 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  c, a);.**.** the
12820 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70  n aiMap[] is pop
12830 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20  ulated with {2, 
12840 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65  0, 1}..*/.#ifnde
12850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
12860 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
12870 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20  e3FindInIndex(. 
12880 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
128a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
128b0 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20  /.  Expr *pX,   
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
128d0 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64  * The right-hand
128e0 20 73 69 64 65 20 28 52 48 53 29 20 6f 66 20 74   side (RHS) of t
128f0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
12900 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c  /.  u32 inFlags,
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12920 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c  * IN_INDEX_LOOP,
12930 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e   _MEMBERSHIP, an
12940 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f  d/or _NOOP_OK */
12950 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73  .  int *prRhsHas
12960 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  Null,         /*
12970 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
12980 67 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20  g NULL status.  
12990 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69  See notes */.  i
129a0 6e 74 20 2a 61 69 4d 61 70 20 20 20 20 20 20 20  nt *aiMap       
129b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70            /* Map
129c0 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20  ping from Index 
129d0 66 69 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69  fields to RHS fi
129e0 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  elds */.){.  Sel
129f0 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a10 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
12a20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
12a30 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
12a40 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a60 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
12a70 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
12a80 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
12a90 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
12aa0 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
12ab0 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
12ac0 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
12ad0 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
12ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12af0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
12b00 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
12b10 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  que */.  Vdbe *v
12b20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12b30 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  e(pParse);     /
12b40 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
12b50 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
12b60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
12b70 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d  op==TK_IN );.  m
12b80 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69  ustBeUnique = (i
12b90 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
12ba0 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f  X_LOOP)!=0;..  /
12bb0 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20  * If the RHS of 
12bc0 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65  this IN(...) ope
12bd0 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43  rator is a SELEC
12be0 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74  T, and if it mat
12bf0 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68  ters .  ** wheth
12c00 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45  er or not the SE
12c10 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74  LECT result cont
12c20 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
12c30 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a  , check whether.
12c40 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c    ** or not NULL
12c50 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
12c60 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f  sible (it may no
12c70 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  t be, for exampl
12c80 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20  e, due .  ** to 
12c90 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
12ca0 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ints in the sche
12cb0 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20  ma). If no NULL 
12cc0 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69  values are possi
12cd0 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72  ble,.  ** set pr
12ce0 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20  RhsHasNull to 0 
12cf0 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
12d00 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52  g.  */.  if( prR
12d10 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58  hsHasNull && (pX
12d20 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
12d30 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
12d40 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69  nt i;.    ExprLi
12d50 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d  st *pEList = pX-
12d60 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
12d70 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
12d80 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
12d90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
12da0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
12db0 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61  BeNull(pEList->a
12dc0 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65  [i].pExpr) ) bre
12dd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
12de0 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  ( i==pEList->nEx
12df0 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68  pr ){.      prRh
12e00 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  sHasNull = 0;.  
12e10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
12e20 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
12e30 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
12e40 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  or index can be 
12e50 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74  used to.  ** sat
12e60 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20  isfy the query. 
12e70 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61   This is prefera
12e80 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e  ble to generatin
12e90 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70  g a new .  ** ep
12ea0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20  hemeral table.  
12eb0 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
12ec0 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d  >nErr==0 && (p =
12ed0 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
12ee0 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a  nOpt(pX))!=0 ){.
12ef0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
12f00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
12f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
12f20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12f30 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  n */.    Table *
12f40 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f60 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e  /* Table <table>
12f70 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62  . */.    i16 iDb
12f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
12fb0 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20  for pTab */.    
12fc0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
12fd0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
12fe0 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45    int nExpr = pE
12ff0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
13000 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13010 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ist!=0 );       
13020 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
13030 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
13040 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
13050 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13060 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  ist->a[0].pExpr!
13070 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  =0 ); /* Because
13080 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
13090 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
130a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
130b0 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  c!=0 );         
130c0 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
130d0 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
130e0 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
130f0 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
13100 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
13110 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
13120 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  Transaction and 
13130 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72  OP_TableLock for
13140 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
13150 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
13160 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
13170 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
13180 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
13190 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
131a0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
131b0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
131c0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
131d0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
131e0 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73  >zName);..    as
131f0 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c  sert(v);  /* sql
13200 69 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61  ite3GetVdbe() ha
13210 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72  s always been pr
13220 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20  eviously called 
13230 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72  */.    if( nExpr
13240 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
13250 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  [0].pExpr->iColu
13260 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mn<0 ){.      /*
13270 20 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45   The "x IN (SELE
13280 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61  CT rowid FROM ta
13290 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20  ble)" case */.  
132a0 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
132b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
132c0 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20  0(v, OP_Once);. 
132d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
132e0 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  e(v);..      sql
132f0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
13300 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
13310 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
13320 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
13330 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
13340 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
13350 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13360 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
13370 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
13380 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
133a0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
133b0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
133c0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31   affinity_ok = 1
133d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a  ;.      int i;..
133e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
133f0 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
13400 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
13410 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61  ed to perform ea
13420 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  ch .      ** com
13430 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
13440 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
13450 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  ity of each colu
13460 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20  mn in table.    
13470 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20    ** on the RHS 
13480 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13490 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20  or.  If it not, 
134a0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
134b0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75  le to.      ** u
134c0 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20  se any index of 
134d0 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20  the RHS table.  
134e0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  */.      for(i=0
134f0 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66  ; i<nExpr && aff
13500 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a  inity_ok; i++){.
13510 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
13520 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
13530 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
13540 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
13550 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
13560 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
13570 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
13580 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
13590 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
135a0 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
135b0 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48  Tab,iCol); /* RH
135c0 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  S table */.     
135d0 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d     char cmpaff =
135e0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
135f0 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64  ffinity(pLhs, id
13600 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74  xaff);.        t
13610 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d  estcase( cmpaff=
13620 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
13630 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
13640 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
13650 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
13660 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
13670 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20   cmpaff ){.     
13680 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
13690 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  _AFF_BLOB:.     
136a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
136b0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
136c0 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
136d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
136e0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
136f0 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72  ity() only retur
13700 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73  ns TEXT if one s
13710 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20  ide or the.     
13720 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
13730 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  has no affinity 
13740 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69  and the other si
13750 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e  de is TEXT.  Hen
13760 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce,.            
13770 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** the only way 
13780 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65  for cmpaff to be
13790 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78   TEXT is for idx
137a0 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20  aff to be TEXT. 
137b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
137c0 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f  d for the term o
137d0 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
137e0 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61   IN to have no a
137f0 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
13800 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13810 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  idxaff==SQLITE_A
13820 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
13830 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13840 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
13850 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66  .            aff
13860 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74  inity_ok = sqlit
13870 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
13880 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20  ity(idxaff);.   
13890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
138a0 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e 69        if( affini
138b0 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20  ty_ok ){.       
138c0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
138d0 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  n existing index
138e0 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20   that will work 
138f0 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
13900 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
13910 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
13920 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
13930 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49  Type==0; pIdx=pI
13940 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
13950 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f        Bitmask co
13960 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43  lUsed;      /* C
13970 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
13980 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  dex used */.    
13990 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43        Bitmask mC
139a0 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ol;         /* M
139b0 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72  ask for the curr
139c0 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ent column */.  
139d0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
139e0 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20  ->nColumn<nExpr 
139f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13a00 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
13a10 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d   nColumn is BMS-
13a20 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f  2, not BMS-1, so
13a30 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d   that we can com
13a40 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  pute.          *
13a50 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29  * BITMASK(nExpr)
13a60 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f   without overflo
13a70 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  wing */.        
13a80 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
13a90 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32  ->nColumn==BMS-2
13aa0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
13ab0 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43  stcase( pIdx->nC
13ac0 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a  olumn==BMS-1 );.
13ad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
13ae0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53  dx->nColumn>=BMS
13af0 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  -1 ) continue;. 
13b00 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75 73           if( mus
13b10 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20  tBeUnique ){.   
13b20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
13b30 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72  x->nKeyCol>nExpr
13b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
13b50 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
13b60 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71 75  Expr && !IsUniqu
13b70 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20  eIndex(pIdx)).  
13b80 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
13b90 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
13ba0 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e  nue;  /* This in
13bb0 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  dex is not uniqu
13bc0 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48  e over the IN RH
13bd0 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  S columns */.   
13be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13bf0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
13c00 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b      colUsed = 0;
13c10 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
13c20 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66   index used so f
13c30 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ar */.          
13c40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
13c50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13c60 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
13c70 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
13c80 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70  eldSubexpr(pX->p
13c90 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
13ca0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68 73        Expr *pRhs
13cb0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
13cc0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
13cd0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
13ce0 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
13cf0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
13d00 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68  Parse, pLhs, pRh
13d10 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
13d20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20  int j;.  .      
13d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
13d40 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69  eq!=0 || pRhs->i
13d50 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44  Column==XN_ROWID
13d60 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
13d70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
13d80 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72  for(j=0; j<nExpr
13d90 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
13da0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
13db0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68  aiColumn[j]!=pRh
13dc0 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  s->iColumn ) con
13dd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
13de0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
13df0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a  x->azColl[j] );.
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
13e10 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c  ( pReq!=0 && sql
13e20 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71  ite3StrICmp(pReq
13e30 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
13e40 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a  zColl[j])!=0 ){.
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13e80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13e90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13ea0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
13eb0 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  nExpr ) break;. 
13ec0 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20             mCol 
13ed0 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20  = MASKBIT(j);.  
13ee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 43            if( mC
13ef0 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62  ol & colUsed ) b
13f00 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f  reak; /* Each co
13f10 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f  lumn used only o
13f20 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nce */.         
13f30 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43     colUsed |= mC
13f40 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
13f50 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61  if( aiMap ) aiMa
13f60 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  p[i] = j;.      
13f70 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
13f80 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45     assert( i==nE
13f90 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d  xpr || colUsed!=
13fa0 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d  (MASKBIT(nExpr)-
13fb0 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1) );.          
13fc0 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41  if( colUsed==(MA
13fd0 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20  SKBIT(nExpr)-1) 
13fe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
13ff0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
14000 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
14010 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70  eans the index p
14020 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f  Idx is usable */
14030 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
14040 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
14050 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
14060 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
14070 72 61 67 65 28 76 29 3b 0a 23 69 66 6e 64 65 66  rage(v);.#ifndef
14080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
14090 4c 41 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20  LAIN.           
140a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
140b0 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
140c0 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
140d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
140e0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 55 53 49  MPrintf(db, "USI
140f0 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20  NG INDEX %s FOR 
14100 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64  IN-OPERATOR",pId
14110 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  x->zName),.     
14120 20 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41           P4_DYNA
14130 4d 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  MIC);.#endif.   
14140 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14150 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14160 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
14170 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
14180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
14190 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
141a0 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
141b0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
141c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
141d0 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  , "%s", pIdx->zN
141e0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
141f0 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e     assert( IN_IN
14200 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d  DEX_INDEX_DESC =
14210 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
14220 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20  _ASC+1 );.      
14230 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
14240 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
14250 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   + pIdx->aSortOr
14260 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20  der[0];.  .     
14270 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68 73         if( prRhs
14280 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65  HasNull ){.#ifde
14290 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
142a0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
142b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
142c0 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45  64 mask = (1<<nE
142d0 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20  xpr)-1;.        
142e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
142f0 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
14300 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a  P_ColumnsUsed, .
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14320 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75    iTab, 0, 0, (u
14330 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54  8*)&mask, P4_INT
14340 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  64);.#endif.    
14350 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73            *prRhs
14360 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  HasNull = ++pPar
14370 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
14380 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78 70          if( nExp
14390 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r==1 ){.        
143a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
143b0 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
143c0 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73   iTab, *prRhsHas
143d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
143e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
143f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14400 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14410 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
14420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14430 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f      } /* End loo
14440 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a  p over indexes *
14450 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64  /.      } /* End
14460 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b   if( affinity_ok
14470 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45   ) */.    } /* E
14480 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77  nd if not an row
14490 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20  id index */.  } 
144a0 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74  /* End attempt t
144b0 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67  o optimize using
144c0 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20   an index */..  
144d0 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73  /* If no preexis
144e0 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76  ting index is av
144f0 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
14500 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61  IN clause.  ** a
14510 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  nd IN_INDEX_NOOP
14520 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72   is an allowed r
14530 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  eply.  ** and th
14540 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
14550 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
14560 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65  st, not a subque
14570 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ry.  ** and the 
14580 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  RHS is not const
14590 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f  ant or has two o
145a0 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20  r fewer terms,. 
145b0 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e   ** then it is n
145c0 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e  ot worth creatin
145d0 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  g an ephemeral t
145e0 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
145f0 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65  .  ** the IN ope
14600 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20  rator so return 
14610 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20  IN_INDEX_NOOP.. 
14620 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
14630 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67  =0.   && (inFlag
14640 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  s & IN_INDEX_NOO
14650 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70  P_OK).   && !Exp
14660 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
14670 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20   EP_xIsSelect). 
14680 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e    && (!sqlite3In
14690 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58  RhsIsConstant(pX
146a0 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74  ) || pX->x.pList
146b0 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b  ->nExpr<=2).  ){
146c0 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
146d0 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  INDEX_NOOP;.  }.
146e0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
146f0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
14700 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73  not find an exis
14710 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
14720 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
14730 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
14740 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
14750 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
14760 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
14770 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
14780 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73      */.    u32 s
14790 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
147a0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
147b0 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61  oop;.    int rMa
147c0 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
147d0 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
147e0 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
147f0 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e   inFlags & IN_IN
14800 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_LOOP ){.    
14810 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
14820 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Loop = 0;.      
14830 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
14840 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
14850 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
14860 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
14870 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
14880 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
14890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
148a0 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73  lse if( prRhsHas
148b0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70  Null ){.      *p
148c0 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d  rRhsHasNull = rM
148d0 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
148e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
148f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
14900 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
14910 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65  se, pX, rMayHave
14920 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f  Null, eType==IN_
14930 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20  INDEX_ROWID);.  
14940 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
14950 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
14960 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b  ryLoop;.  }else{
14970 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
14980 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69  = iTab;.  }..  i
14990 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70  f( aiMap && eTyp
149a0 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
149b0 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d  X_ASC && eType!=
149c0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
149d0 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ESC ){.    int i
149e0 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  , n;.    n = sql
149f0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
14a00 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  ze(pX->pLeft);. 
14a10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
14a20 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d   i++) aiMap[i] =
14a30 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
14a40 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
14a50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14a60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
14a70 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45  *.** Argument pE
14a80 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e  xpr is an (?, ?.
14a90 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72  ..) IN(...) expr
14aa0 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a  ession. This .**
14ab0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
14ac0 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
14ad0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
14ae0 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
14af0 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e  ng .** the affin
14b00 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64  ities to be used
14b10 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
14b20 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
14b30 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  on..**.** It is 
14b40 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
14b50 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
14b60 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
14b70 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
14b80 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75  string is eventu
14b90 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
14ba0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
14bb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
14bc0 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79   *exprINAffinity
14bd0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14be0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
14bf0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
14c00 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e  xpr->pLeft;.  in
14c10 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
14c20 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
14c30 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20  Left);.  Select 
14c40 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70  *pSelect = (pExp
14c50 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
14c60 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72  sSelect) ? pExpr
14c70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b  ->x.pSelect : 0;
14c80 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  .  char *zRet;..
14c90 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14ca0 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
14cb0 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  zRet = sqlite3Db
14cc0 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65  MallocRaw(pParse
14cd0 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20  ->db, nVal+1);. 
14ce0 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
14cf0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
14d00 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
14d10 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
14d20 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  A = sqlite3Vecto
14d30 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
14d40 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63  eft, i);.      c
14d50 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45  har a = sqlite3E
14d60 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b  xprAffinity(pA);
14d70 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65  .      if( pSele
14d80 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  ct ){.        zR
14d90 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43  et[i] = sqlite3C
14da0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
14db0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
14dc0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a  a[i].pExpr, a);.
14dd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14de0 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61       zRet[i] = a
14df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14e00 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d      zRet[nVal] =
14e10 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74   '\0';.  }.  ret
14e20 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
14e30 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
14e40 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14e50 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
14e60 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73  Parse object pas
14e70 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
14e80 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
14e90 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  n error .** mess
14ea0 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
14eb0 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
14ec0 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
14ed0 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
14ee0 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20  d M".*/   .void 
14ef0 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
14f00 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
14f10 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c  rse, int nActual
14f20 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a  , int nExpect){.
14f30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
14f40 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74  mt = "sub-select
14f50 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75   returns %d colu
14f60 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25  mns - expected %
14f70 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  d";.  sqlite3Err
14f80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46  orMsg(pParse, zF
14f90 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78  mt, nActual, nEx
14fa0 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pect);.}.#endif.
14fb0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
14fc0 6e 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63  n pExpr is a vec
14fd0 74 6f 72 20 74 68 61 74 20 68 61 73 20 62 65 65  tor that has bee
14fe0 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74  n used in a cont
14ff0 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ext where.** it 
15000 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  is not permitted
15010 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  . If pExpr is a 
15020 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f  sub-select vecto
15030 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
15040 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61  .** loads the Pa
15050 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20  rse object with 
15060 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65  a message of the
15070 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
15080 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
15090 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  ns N columns - e
150a0 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a  xpected 1".**.**
150b0 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61 20   Or, if it is a 
150c0 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76  regular scalar v
150d0 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ector:.**.**   "
150e0 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
150f0 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  d".*/   .void sq
15100 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
15110 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Msg(Parse *pPars
15120 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
15130 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15140 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
15150 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
15160 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
15170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75  ){.    sqlite3Su
15180 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
15190 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  rse, pExpr->x.pS
151a0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
151b0 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Expr, 1);.  }els
151c0 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
151d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
151e0 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
151f0 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
15200 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
15210 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
15220 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
15230 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
15240 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45  ry expression, E
15250 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20  XISTS,.** or IN 
15260 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
15270 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
15280 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
15290 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
152a0 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
152b0 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
152c0 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
152d0 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
152e0 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
15300 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
15310 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
15320 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
15330 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
15340 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
15350 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
15360 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
15370 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
15380 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
15390 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
153a0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
153b0 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
153c0 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
153d0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
153e0 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
153f0 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
15400 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
15410 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
15420 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
15430 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
15440 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
15450 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
15460 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
15470 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
15480 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
15490 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
154a0 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
154b0 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
154c0 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
154d0 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
154e0 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
154f0 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
15500 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
15510 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
15520 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
15530 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
15540 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
15550 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
15560 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
15570 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
15580 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
15590 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
155a0 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
155b0 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f  ..** All this ro
155c0 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
155d0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67  itialize the reg
155e0 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72  ister given by r
155f0 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74  MayHaveNull.** t
15600 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
15610 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
15620 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e  ake care of chan
15630 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74  ging this regist
15640 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e  er.** value to n
15650 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
15660 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
15670 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c  .**.** For a SEL
15680 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70  ECT or EXISTS op
15690 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74  erator, return t
156a0 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
156b0 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65   holds the.** re
156c0 73 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c  sult.  For a mul
156d0 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54  ti-column SELECT
156e0 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
156f0 73 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74  stored in a cont
15700 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20  iguous.** array 
15710 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  of registers and
15720 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
15730 65 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65  e is the registe
15740 72 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f  r of the left-mo
15750 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  st.** result col
15760 75 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66  umn.  Return 0 f
15770 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  or IN operators 
15780 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
15790 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ccurs..*/.#ifnde
157a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
157b0 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
157c0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
157d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
157e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
157f0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15800 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
15810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15820 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72  e IN, SELECT, or
15830 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
15840 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75   */.  int rHasNu
15850 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a  llFlag,       /*
15860 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72   Register that r
15870 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e  ecords whether N
15880 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48  ULLs exist in RH
15890 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77  S */.  int isRow
158a0 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  id             /
158b0 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f  * If true, LHS o
158c0 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  f IN operator is
158d0 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20   a rowid */.){. 
158e0 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69   int jmpIfDynami
158f0 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  c = -1;         
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15910 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
15920 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dress */.  int r
15930 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
15960 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67  toring resulting
15970 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
15980 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
15990 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45  Parse);.  if( NE
159a0 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
159b0 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45  rn 0;.  sqlite3E
159c0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
159d0 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  rse);..  /* The 
159e0 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68  evaluation of th
159f0 65 20 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45  e IN/EXISTS/SELE
15a00 43 54 20 6d 75 73 74 20 62 65 20 72 65 70 65 61  CT must be repea
15a10 74 65 64 20 65 76 65 72 79 20 74 69 6d 65 20 69  ted every time i
15a20 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e  t.  ** is encoun
15a30 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20  tered if any of 
15a40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
15a50 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
15a60 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
15a70 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
15a80 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
15a90 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
15aa0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
15ab0 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
15ac0 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
15ad0 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
15ae0 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
15af0 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
15b00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
15b10 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
15b20 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
15b30 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
15b40 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
15b50 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
15b60 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
15b70 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
15b80 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
15b90 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
15ba0 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
15bb0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15bc0 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  VarSelect) ){.  
15bd0 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
15be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15bf0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
15c00 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15c10 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
15c20 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
15c30 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  N.  if( pParse->
15c40 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
15c50 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
15c60 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
15c70 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55  arse->db, "EXECU
15c80 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59  TE %s%s SUBQUERY
15c90 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d   %d",.        jm
15ca0 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22  pIfDynamic>=0?""
15cb0 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a  :"CORRELATED ",.
15cc0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
15cd0 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a  p==TK_IN?"LIST":
15ce0 22 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20  "SCALAR",.      
15cf0 20 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53    pParse->iNextS
15d00 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20  electId.    );. 
15d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d20 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
15d30 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
15d40 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
15d50 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
15d60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77    }.#endif..  sw
15d70 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
15d80 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
15d90 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
15da0 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
15db0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
15dc0 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
15dd0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
15de0 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
15df0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
15e00 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48  pLeft; /* the LH
15e10 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
15e20 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65  ator */.      Ke
15e30 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
15e40 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79  = 0;      /* Key
15e50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
15e60 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20        int nVal; 
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e80 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63    /* Size of vec
15e90 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20  tor pLeft */.   
15ea0 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d     .      nVal =
15eb0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
15ec0 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
15ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
15ee0 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31  Rowid || nVal==1
15ef0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68   );..      /* Wh
15f00 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
15f10 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
15f20 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
15f30 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
15f40 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
15f50 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
15f60 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
15f70 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
15f80 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
15f90 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b  led with index k
15fa0 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
15fb0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
15fc0 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  m the .      ** 
15fd0 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
15fe0 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
15ff0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
16000 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
16010 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
16020 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
16030 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
16040 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
16050 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
16060 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
16070 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
16080 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
16090 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
160a0 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
160b0 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
160c0 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
160d0 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
160e0 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
160f0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
16100 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
16110 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
16120 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
16130 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
16140 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
16150 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
16160 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
16170 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
16180 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
16190 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
161a0 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
161b0 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
161c0 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
161d0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
161e0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
161f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16200 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a  OpenEphemeral, .
16210 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16220 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69  >iTable, (isRowi
16230 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20  d?0:nVal));.    
16240 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52    pKeyInfo = isR
16250 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74  owid ? 0 : sqlit
16260 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
16270 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c  Parse->db, nVal,
16280 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
16290 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
162a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
162b0 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
162c0 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
162d0 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
162e0 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
162f0 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
16300 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
16310 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
16320 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
16330 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
16340 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
16350 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
16360 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
16370 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65     */.        Se
16380 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
16390 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
163a0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
163b0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65  st *pEList = pSe
163c0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20  lect->pEList;.. 
163d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
163e0 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  isRowid );.     
163f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53     /* If the LHS
16400 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20   and RHS of the 
16410 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e  IN operator do n
16420 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20  ot match, that. 
16430 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20         ** error 
16440 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63  will have been c
16450 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72  aught long befor
16460 65 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  e we reach this 
16470 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  point. */.      
16480 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c    if( ALWAYS(pEL
16490 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c  ist->nExpr==nVal
164a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  ) ){.          S
164b0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
164c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
164d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
164e0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
164f0 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c  (&dest, SRT_Set,
16500 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
16510 0a 20 20 20 20 20 20 20 20 20 20 64 65 73 74 2e  .          dest.
16520 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49  zAffSdst = exprI
16530 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
16540 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
16550 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69      pSelect->iLi
16560 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16570 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
16580 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
16590 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
165a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
165b0 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  se( pKeyInfo==0 
165c0 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20  ); /* Caused by 
165d0 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65  OOM in sqlite3Ke
165e0 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a  yInfoAlloc() */.
165f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
16600 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
16610 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
16620 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
16630 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16640 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73  (pParse->db, des
16650 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20  t.zAffSdst);.   
16660 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16670 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
16680 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  yInfo);.        
16690 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
166a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
166b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
166c0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65  e(pParse->db, de
166d0 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20  st.zAffSdst);.  
166e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
166f0 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f  pKeyInfo!=0 ); /
16700 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  * OOM will cause
16710 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69   exit after sqli
16720 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20  te3Select() */. 
16730 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16740 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
16750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16760 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
16770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
16780 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
16790 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
167a0 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
167b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
167c0 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
167d0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
167e0 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
167f0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
16800 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
16810 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
16820 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
16830 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
16840 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20  lSeq(.          
16850 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c        pParse, p,
16860 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
16870 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  xpr.            
16880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
16890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
168a0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
168b0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
168c0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
168d0 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
168e0 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
168f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
16900 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
16910 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
16920 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
16930 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
16940 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
16950 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
16960 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16970 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
16980 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
16990 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
169a0 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
169b0 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
169c0 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
169d0 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
169e0 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
169f0 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
16a00 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
16a10 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
16a20 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
16a30 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
16a40 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20  y of the LHS of 
16a50 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  the IN */.      
16a60 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
16a70 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
16a80 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
16a90 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
16aa0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
16ab0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
16ac0 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
16ad0 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74  .        affinit
16ae0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
16af0 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a  ffinity(pLeft);.
16b00 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
16b10 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
16b20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
16b30 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
16b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16b50 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
16b60 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
16b70 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
16b80 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
16b90 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
16ba0 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
16bb0 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
16bc0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
16bd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
16be0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
16bf0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
16c00 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
16c10 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
16c20 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
16c30 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
16c40 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
16c50 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
16c60 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16c70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
16c80 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71  if( isRowid ) sq
16c90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16ca0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
16cb0 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  2);.        for(
16cc0 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  i=pList->nExpr, 
16cd0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
16ce0 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
16cf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
16d00 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
16d10 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
16d20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b    int iValToIns;
16d30 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
16d40 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
16d50 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
16d60 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
16d70 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
16d80 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
16d90 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
16da0 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
16db0 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
16dc0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
16dd0 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
16de0 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
16df0 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
16e00 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
16e10 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
16e20 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
16e30 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
16e40 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
16e50 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70           if( jmp
16e60 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20  IfDynamic>=0 && 
16e70 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
16e80 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
16e90 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16ea0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
16eb0 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  op(v, jmpIfDynam
16ec0 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ic);.           
16ed0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
16ee0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
16ef0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
16f00 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
16f10 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
16f20 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
16f30 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
16f40 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
16f50 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
16f60 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69  sInteger(pE2, &i
16f70 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20  ValToIns) ){.   
16f80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16f90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16fa0 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70  _InsertInt, pExp
16fb0 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69  r->iTable, r2, i
16fc0 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20  ValToIns);.     
16fd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16fe0 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c          r3 = sql
16ff0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
17000 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  et(pParse, pE2, 
17010 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
17020 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
17040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17050 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
17060 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17090 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
170a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
170b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
170c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
170d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
170e0 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
170f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
17100 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  2, r3);.        
17110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17120 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17130 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17140 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c  _MakeRecord, r3,
17150 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
17160 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
17170 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17180 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
17190 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20  nge(pParse, r3, 
171a0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
171b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
171c0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
171d0 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
171e0 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31  Table, r2, r3, 1
171f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
17200 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
17220 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17230 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
17240 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17250 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17260 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
17270 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
17280 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
17290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
172a0 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
172b0 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f  (void *)pKeyInfo
172c0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
172d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
172e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
172f0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
17300 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
17310 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  T:.    default: 
17320 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
17330 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e  3:    (SELECT ..
17340 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20  . FROM ...).    
17350 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20    **     or:    
17360 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e  EXISTS(SELECT ..
17370 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20  . FROM ...).    
17380 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
17390 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65  r a SELECT, gene
173a0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
173b0 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
173c0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  all columns of. 
173d0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
173e0 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72  t row into an ar
173f0 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
17400 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
17410 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a  index of.      *
17420 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
17430 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ster..      **. 
17440 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
17450 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
17460 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30  ite an integer 0
17470 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
17480 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 20 20   1 (exists).    
17490 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69    ** into a regi
174a0 73 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ster and return 
174b0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75  that register nu
174c0 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  mber..      **. 
174d0 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20       ** In both 
174e0 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72 79  cases, the query
174f0 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69   is augmented wi
17500 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41  th "LIMIT 1".  A
17510 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65  ny .      ** pre
17520 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69  existing limit i
17530 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70  s discarded in p
17540 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20  lace of the new 
17550 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a  LIMIT 1..      *
17560 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
17570 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17590 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
175a0 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
175b0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
175c0 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
175d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
175e0 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
175f0 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECT result */.
17600 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20        int nReg; 
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17630 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
17640 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74  cate */..      t
17650 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
17660 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
17670 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17680 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
17690 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61  ELECT );.      a
176a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
176b0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
176c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
176d0 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
176e0 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
176f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
17700 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20  IsSelect) );..  
17710 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72      pSel = pExpr
17720 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
17730 20 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d     nReg = pExpr-
17740 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f  >op==TK_SELECT ?
17750 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSel->pEList->n
17760 45 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20  Expr : 1;.      
17770 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
17780 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
17790 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b  pParse->nMem+1);
177a0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
177b0 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Mem += nReg;.   
177c0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
177d0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
177e0 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
177f0 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  t = SRT_Mem;.   
17800 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20       dest.iSdst 
17810 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
17820 20 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64          dest.nSd
17830 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20  st = nReg;.     
17840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17850 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
17860 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
17870 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e  , dest.iSDParm+n
17880 52 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Reg-1);.        
17890 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
178a0 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72  "Init subquery r
178b0 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
178c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
178d0 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
178e0 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
178f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17900 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17910 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
17920 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
17930 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
17940 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29   EXISTS result")
17950 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17960 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
17970 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
17980 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  Sel->pLimit);.  
17990 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74      pSel->pLimit
179a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
179b0 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
179c0 54 4b 5f 49 4e 54 45 47 45 52 2c 0a 20 20 20 20  TK_INTEGER,.    
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
179f0 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
17a00 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 53  1], 0);.      pS
17a10 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
17a20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
17a30 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74  lags &= ~SF_Mult
17a40 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66  iValue;.      if
17a50 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
17a60 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
17a70 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
17a80 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
17a90 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64  }.      rReg = d
17aa0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
17ab0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
17ac0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17ad0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
17ae0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17af0 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c  }..  if( rHasNul
17b00 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c  lFlag ){.    sql
17b10 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
17b20 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61  ag(v, pExpr->iTa
17b30 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61  ble, rHasNullFla
17b40 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a  g);.  }..  if( j
17b50 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29  mpIfDynamic>=0 )
17b60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
17b70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
17b80 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a  IfDynamic);.  }.
17b90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17ba0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a  hePop(pParse);..
17bb0 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
17bc0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
17bd0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
17be0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
17bf0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
17c00 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20  ./*.** Expr pIn 
17c10 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78  is an IN(...) ex
17c20 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66  pression. This f
17c30 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
17c40 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d  hat the .** sub-
17c50 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48  select on the RH
17c60 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70  S of the IN() op
17c70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73  erator has the s
17c80 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  ame number of .*
17c90 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65  * columns as the
17ca0 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
17cb0 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52  HS. Or, if the R
17cc0 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69  HS of the IN() i
17cd0 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d  s not .** a sub-
17ce0 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20  query, that the 
17cf0 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20  LHS is a vector 
17d00 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e  of size 1..*/.in
17d10 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
17d20 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72  ckIN(Parse *pPar
17d30 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a  se, Expr *pIn){.
17d40 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20    int nVector = 
17d50 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
17d60 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74  rSize(pIn->pLeft
17d70 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66  );.  if( (pIn->f
17d80 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
17d90 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
17da0 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e  nVector!=pIn->x.
17db0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
17dc0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
17dd0 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
17de0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49  Error(pParse, pI
17df0 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
17e00 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65  List->nExpr, nVe
17e10 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ctor);.      ret
17e20 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
17e30 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72  else if( nVector
17e40 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=1 ){.    sqlit
17e50 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
17e60 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c  (pParse, pIn->pL
17e70 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  eft);.    return
17e80 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
17e90 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
17ea0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17eb0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
17ec0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
17ed0 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
17ee0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
17ef0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
17f00 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
17f10 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
17f20 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
17f30 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
17f40 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72  ) is a scalar or
17f50 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
17f60 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67  on.  The .** rig
17f70 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
17f80 53 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  S) is an array o
17f90 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73  f zero or more s
17fa0 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72  calar values, or
17fb0 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20   a.** subquery. 
17fc0 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
17fd0 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e   subquery, the n
17fe0 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
17ff0 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20  columns must.** 
18000 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
18010 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
18020 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
18030 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48   LHS.  If the RH
18040 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f  S is.** a list o
18050 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48  f values, the LH
18060 53 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c  S must be a scal
18070 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49  ar. .**.** The I
18080 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72  N operator is tr
18090 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61  ue if the LHS va
180a0 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  lue is contained
180b0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
180c0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
180d0 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c  s false if the L
180e0 48 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79  HS is definitely
180f0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e   not in the RHS.
18100 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74    The .** result
18110 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
18120 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20  presence of the 
18130 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63  LHS in the RHS c
18140 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74  annot be .** det
18150 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e  ermined due to N
18160 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ULLs..**.** This
18170 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
18180 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d  es code that jum
18190 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  ps to destIfFals
181a0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
181b0 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  not .** containe
181c0 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
181d0 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c  .  If due to NUL
181e0 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  Ls we cannot det
181f0 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48  ermine if the LH
18200 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65  S.** is containe
18210 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  d in the RHS the
18220 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  n jump to destIf
18230 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48  Null.  If the LH
18240 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  S is contained.*
18250 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  * within the RHS
18260 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
18270 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  gh..**.** See th
18280 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70  e separate in-op
18290 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65  erator.md docume
182a0 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20  ntation file in 
182b0 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
182c0 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74   SQLite source t
182d0 72 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ree for addition
182e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
182f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
18300 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
18310 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18320 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
18330 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
18340 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
18350 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
18360 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
18370 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
18380 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
18390 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a  False,      /* J
183a0 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20  ump here if LHS 
183b0 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
183c0 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   in the RHS */. 
183d0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
183e0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
183f0 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ere if the resul
18400 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64  ts are unknown d
18410 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29  ue to NULLs */.)
18420 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e  {.  int rRhsHasN
18430 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67  ull = 0;  /* Reg
18440 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72  ister that is tr
18450 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69  ue if RHS contai
18460 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a  ns NULL values *
18470 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
18480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
18490 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a  e of the RHS */.
184a0 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20    int rLhs;     
184b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
184c0 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74  ter(s) holding t
184d0 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f  he LHS values */
184e0 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b  .  int rLhsOrig;
184f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20           /* LHS 
18500 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20  values prior to 
18510 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69  reordering by ai
18520 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20  Map[] */.  Vdbe 
18530 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
18540 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
18550 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
18560 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
18570 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d   = 0;       /* M
18580 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66  ap from vector f
18590 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f  ield to index co
185a0 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
185b0 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  zAff = 0;       
185c0 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
185d0 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ng for compariso
185e0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63  ns */.  int nVec
185f0 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tor;          /*
18600 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73   Size of vectors
18610 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
18620 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
18630 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20  Dummy;          
18640 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65   /* Dummy parame
18650 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56  ter to exprCodeV
18660 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70  ector() */.  Exp
18670 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
18680 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66     /* The LHS of
18690 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
186a0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
186b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
186c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
186d0 20 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20   int destStep2; 
186e0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
186f0 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c  to jump when NUL
18700 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20  Ls seen in step 
18710 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  2 */.  int destS
18720 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tep6 = 0;    /* 
18730 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f  Start of code fo
18740 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e  r Step 6 */.  in
18750 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20  t addrTruthOp;  
18760 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18770 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65  f opcode that de
18780 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20  termines the IN 
18790 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
187a0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20   destNotNull;   
187b0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
187c0 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  if a comparison 
187d0 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73  is not true in s
187e0 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
187f0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
18800 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73   /* Top of the s
18810 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a  tep-6 loop */ ..
18820 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
18830 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71  >pLeft;.  if( sq
18840 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
18850 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 20  (pParse, pExpr) 
18860 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66  ) return;.  zAff
18870 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74   = exprINAffinit
18880 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  y(pParse, pExpr)
18890 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71  ;.  nVector = sq
188a0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
188b0 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ize(pExpr->pLeft
188c0 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e  );.  aiMap = (in
188d0 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  t*)sqlite3DbMall
188e0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50  ocZero(.      pP
188f0 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f  arse->db, nVecto
18900 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b  r*(sizeof(int) +
18910 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b   sizeof(char)) +
18920 20 31 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50   1.  );.  if( pP
18930 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
18940 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71  Failed ) goto sq
18950 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
18960 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  oom_error;..  /*
18970 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70   Attempt to comp
18980 75 74 65 20 74 68 65 20 52 48 53 2e 20 41 66 74  ute the RHS. Aft
18990 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 69 66  er this step, if
189a0 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
189b0 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44  than.  ** IN_IND
189c0 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72  EX_NOOP is retur
189d0 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f  ned, the table o
189e0 70 65 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72  pened ith cursor
189f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a   pExpr->iTable .
18a00 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
18a10 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
18a20 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 20 49  ke up the RHS. I
18a30 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  f IN_INDEX_NOOP 
18a40 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a  is returned,.  *
18a50 2a 20 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f  * the RHS has no
18a60 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64  t yet been coded
18a70 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
18a80 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
18a90 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
18aa0 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
18ab0 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
18ac0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
18ad0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
18ae0 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
18af0 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
18b00 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
18b10 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
18b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
18b40 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
18b50 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  P | IN_INDEX_NOO
18b60 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20  P_OK,.          
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d     destIfFalse==
18b90 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a  destIfNull ? 0 :
18ba0 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61   &rRhsHasNull, a
18bb0 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74  iMap);..  assert
18bc0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
18bd0 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20  | nVector==1 || 
18be0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
18bf0 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  EPH.       || eT
18c00 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
18c10 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65  DEX_ASC || eType
18c20 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
18c30 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64  _DESC .  );.#ifd
18c40 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
18c50 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61    /* Confirm tha
18c60 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69  t aiMap[] contai
18c70 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67  ns nVector integ
18c80 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  er values betwee
18c90 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65  n 0 and.  ** nVe
18ca0 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72  ctor-1. */.  for
18cb0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
18cc0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
18cd0 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63  , cnt;.    for(c
18ce0 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f  nt=j=0; j<nVecto
18cf0 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61  r; j++) if( aiMa
18d00 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b  p[j]==i ) cnt++;
18d10 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74  .    assert( cnt
18d20 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ==1 );.  }.#endi
18d30 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  f..  /* Code the
18d40 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
18d50 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
18d60 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20   (...)". If the 
18d70 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76  LHS is a .  ** v
18d80 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69  ector, then it i
18d90 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
18da0 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20  rray of nVector 
18db0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
18dc0 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a  ng .  ** at r1..
18dd0 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65    **.  ** sqlite
18de0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d  3FindInIndex() m
18df0 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65  ight have reorde
18e00 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f  red the fields o
18e10 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72  f the LHS vector
18e20 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
18e30 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20  e fields are in 
18e40 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
18e50 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  s an existing in
18e60 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20  dex.   The.  ** 
18e70 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f  aiMap[] array co
18e80 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67  ntains a mapping
18e90 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
18ea0 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64  al LHS field ord
18eb0 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66  er to.  ** the f
18ec0 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20  ield order that 
18ed0 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20  matches the RHS 
18ee0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  index..  */.  sq
18ef0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
18f00 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 4c  sh(pParse);.  rL
18f10 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64  hsOrig = exprCod
18f20 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
18f30 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b  pLeft, &iDummy);
18f40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
18f50 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69  ector && aiMap[i
18f60 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20  ]==i; i++){} /* 
18f70 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72  Are LHS fields r
18f80 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69  eordered? */.  i
18f90 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b  f( i==nVector ){
18fa0 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c  .    /* LHS fiel
18fb0 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64  ds are not reord
18fc0 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73  ered */.    rLhs
18fd0 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d   = rLhsOrig;.  }
18fe0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  else{.    /* Nee
18ff0 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65  d to reorder the
19000 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f   LHS fields acco
19010 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a  rding to aiMap *
19020 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c  /.    rLhs = sql
19030 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
19040 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
19050 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
19060 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
19070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19080 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
19090 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c  opy, rLhsOrig+i,
190a0 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20   rLhs+aiMap[i], 
190b0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
190c0 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
190d0 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
190e0 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
190f0 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
19100 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
19110 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
19120 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
19130 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
19140 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
19150 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
19160 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  sons..  **.  ** 
19170 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29  This is step (1)
19180 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61   in the in-opera
19190 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64  tor.md optimized
191a0 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f   algorithm..  */
191b0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
191c0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20  _INDEX_NOOP ){. 
191d0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
191e0 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
191f0 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ist;.    CollSeq
19200 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
19210 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
19220 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
19230 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65  t);.    int labe
19240 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lOk = sqlite3Vdb
19250 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19260 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f     int r2, regTo
19270 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65  Free;.    int re
19280 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  gCkNull = 0;.   
19290 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73   int ii;.    ass
192a0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
192b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
192c0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
192d0 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
192e0 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  !=destIfFalse ){
192f0 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c  .      regCkNull
19300 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19310 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19330 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41  ddOp3(v, OP_BitA
19340 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20  nd, rLhs, rLhs, 
19350 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
19360 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
19370 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ii<pList->nExpr;
19380 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32   ii++){.      r2
19390 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
193a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
193b0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
193c0 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a  r, &regToFree);.
193d0 20 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e        if( regCkN
193e0 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78  ull && sqlite3Ex
193f0 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73  prCanBeNull(pLis
19400 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20  t->a[ii].pExpr) 
19410 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19420 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19430 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b  OP_BitAnd, regCk
19440 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e  Null, r2, regCkN
19450 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
19460 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74      if( ii<pList
19470 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73  ->nExpr-1 || des
19480 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
19490 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alse ){.        
194a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
194b0 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73  4(v, OP_Eq, rLhs
194c0 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20  , labelOk, r2,. 
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194e0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
194f0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
19500 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  Q);.        Vdbe
19510 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
19520 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  <pList->nExpr-1)
19530 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
19540 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d  verageIf(v, ii==
19550 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
19560 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19570 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
19580 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zAff[0]);.      
19590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
195a0 73 73 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c  ssert( destIfNul
195b0 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
195c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
195d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
195e0 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74  P_Ne, rLhs, dest
195f0 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20  IfFalse, r2,.   
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
19620 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
19630 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19640 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19650 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
19660 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49  , zAff[0] | SQLI
19670 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
19680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
19690 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
196a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
196b0 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  oFree);.    }.  
196c0 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
196d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
196e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
196f0 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75  _IsNull, regCkNu
19700 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
19710 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19730 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
19740 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20  fFalse);.    }. 
19750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
19760 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
19770 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69  belOk);.    sqli
19780 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19790 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e  g(pParse, regCkN
197a0 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73  ull);.    goto s
197b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
197c0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a  _finished;.  }..
197d0 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65    /* Step 2: Che
197e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
197f0 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e   LHS contains an
19800 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20  y NULL columns. 
19810 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53   If the.  ** LHS
19820 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55   does contain NU
19830 4c 4c 73 20 74 68 65 6e 20 74 68 65 20 72 65 73  LLs then the res
19840 75 6c 74 20 6d 75 73 74 20 62 65 20 65 69 74 68  ult must be eith
19850 65 72 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c  er FALSE or NULL
19860 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74  ..  ** We will t
19870 68 65 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e  hen skip the bin
19880 61 72 79 20 73 65 61 72 63 68 20 6f 66 20 74 68  ary search of th
19890 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66  e RHS..  */.  if
198a0 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
198b0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
198c0 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
198d0 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73  tIfFalse;.  }els
198e0 65 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32  e{.    destStep2
198f0 20 3d 20 64 65 73 74 53 74 65 70 36 20 3d 20 73   = destStep6 = s
19900 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19910 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f  bel(v);.  }.  fo
19920 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
19930 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
19940 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
19950 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
19960 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29  pExpr->pLeft, i)
19970 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
19980 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
19990 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
199a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
199b0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b  OP_IsNull, rLhs+
199c0 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20  i, destStep2);. 
199d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
199e0 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
199f0 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54  .  /* Step 3.  T
19a00 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e  he LHS is now kn
19a10 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
19a20 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61  LL.  Do the bina
19a30 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f  ry search.  ** o
19a40 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20  f the RHS using 
19a50 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f  the LHS as a pro
19a60 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74  be.  If found, t
19a70 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a  he result is.  *
19a80 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69  * true..  */.  i
19a90 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
19aa0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
19ab0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
19ac0 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
19ad0 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
19ae0 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20  -tree and so we 
19af0 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77  also.    ** know
19b00 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73   that the RHS is
19b10 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63   non-NULL.  Henc
19b20 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74  e, we combine st
19b30 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20  eps 3 and 4.    
19b40 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ** into a single
19b50 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
19b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
19b80 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
19b90 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
19ba0 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Lhs);.    VdbeCo
19bb0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61  verage(v);.    a
19bc0 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c  ddrTruthOp = sql
19bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
19be0 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20  , OP_Goto);  /* 
19bf0 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20  Return True */. 
19c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
19c10 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19c20 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c   OP_Affinity, rL
19c30 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20  hs, nVector, 0, 
19c40 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  zAff, nVector);.
19c50 20 20 20 20 69 66 28 20 64 65 73 74 49 66 46 61      if( destIfFa
19c60 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
19c70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62  ){.      /* Comb
19c80 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20 53  ine Step 3 and S
19c90 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e  tep 5 into a sin
19ca0 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  gle opcode */.  
19cb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19cc0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
19cd0 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  otFound, pExpr->
19ce0 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
19cf0 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lse,.           
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
19d20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19d30 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69  .      goto sqli
19d40 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
19d50 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
19d60 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74    /* Ordinary St
19d70 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61  ep 3, for the ca
19d80 73 65 20 77 68 65 72 65 20 46 41 4c 53 45 20 61  se where FALSE a
19d90 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74  nd NULL are dist
19da0 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72  inct */.    addr
19db0 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65  TruthOp = sqlite
19dc0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
19dd0 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
19de0 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20  r->iTable, 0,.  
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f      rLhs, nVecto
19e20 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
19e30 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  (v);.  }..  /* S
19e40 74 65 70 20 34 2e 20 20 49 66 20 74 68 65 20 52  tep 4.  If the R
19e50 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  HS is known to b
19e60 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77  e non-NULL and w
19e70 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20  e did not find. 
19e80 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20   ** an match on 
19e90 74 68 65 20 73 65 61 72 63 68 20 61 62 6f 76 65  the search above
19ea0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
19eb0 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e  t must be FALSE.
19ec0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73  .  */.  if( rRhs
19ed0 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74  HasNull && nVect
19ee0 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  or==1 ){.    sql
19ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19f00 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52  , OP_NotNull, rR
19f10 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49  hsHasNull, destI
19f20 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62  fFalse);.    Vdb
19f30 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19f40 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20  }..  /* Step 5. 
19f50 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61   If we do not ca
19f60 72 65 20 61 62 6f 75 74 20 74 68 65 20 64 69 66  re about the dif
19f70 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
19f80 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41  NULL and.  ** FA
19f90 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  LSE, then just r
19fa0 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20  eturn false. .  
19fb0 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 46  */.  if( destIfF
19fc0 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
19fd0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f   ) sqlite3VdbeGo
19fe0 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
19ff0 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36  e);..  /* Step 6
1a000 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72  : Loop through r
1a010 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20  ows of the RHS. 
1a020 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f   Compare each ro
1a030 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20  w to the LHS..  
1a040 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72  ** If any compar
1a050 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ison is NULL, th
1a060 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
1a070 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20   NULL.  If all. 
1a080 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20   ** comparisons 
1a090 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74  are FALSE then t
1a0a0 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20  he final result 
1a0b0 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20  is FALSE..  **. 
1a0c0 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72   ** For a scalar
1a0d0 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66 66   LHS, it is suff
1a0e0 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  icient to check 
1a0f0 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 72  just the first r
1a100 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52  ow.  ** of the R
1a110 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  HS..  */.  if( d
1a120 65 73 74 53 74 65 70 36 20 29 20 73 71 6c 69 74  estStep6 ) sqlit
1a130 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a140 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36 29  el(v, destStep6)
1a150 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  ;.  addrTop = sq
1a160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a170 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45  v, OP_Rewind, pE
1a180 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
1a190 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62  tIfFalse);.  Vdb
1a1a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a1b0 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b  if( nVector>1 ){
1a1c0 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1a1d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a1e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65  keLabel(v);.  }e
1a1f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20  lse{.    /* For 
1a200 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62  nVector==1, comb
1a210 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64 20  ine steps 6 and 
1a220 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79  7 by immediately
1a230 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a   returning.    *
1a240 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 66  * FALSE if the f
1a250 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  irst comparison 
1a260 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20  is not NULL */. 
1a270 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d     destNotNull =
1a280 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
1a290 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
1a2a0 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
1a2b0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43    Expr *p;.    C
1a2c0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1a2d0 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69     int r3 = sqli
1a2e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1a2f0 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73  arse);.    p = s
1a300 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
1a310 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
1a320 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  i);.    pColl = 
1a330 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1a340 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
1a350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a360 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1a370 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
1a380 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71  , i, r3);.    sq
1a390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a3a0 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69  v, OP_Ne, rLhs+i
1a3b0 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72  , destNotNull, r
1a3c0 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
1a3d0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1a3e0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
1a3f0 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  Q);.    VdbeCove
1a400 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1a410 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a420 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
1a430 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1a440 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a450 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c  to, 0, destIfNul
1a460 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  l);.  if( nVecto
1a470 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
1a480 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a490 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c  el(v, destNotNul
1a4a0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1a4b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a4c0 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  Next, pExpr->iTa
1a4d0 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  ble, addrTop+1);
1a4e0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1a4f0 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74  e(v);..    /* St
1a500 65 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61  ep 7:  If we rea
1a510 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  ch this point, w
1a520 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1a530 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20  result must.    
1a540 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a  ** be false. */.
1a550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a560 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1a570 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
1a580 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
1a590 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72  ps here in order
1a5a0 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e   to return true.
1a5b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1a5c0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1a5d0 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69  rTruthOp);..sqli
1a5e0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
1a5f0 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c  nished:.  if( rL
1a600 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73  hs!=rLhsOrig ) s
1a610 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1a620 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68  pReg(pParse, rLh
1a630 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  s);.  sqlite3Exp
1a640 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1a650 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1a660 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
1a670 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70  r"));.sqlite3Exp
1a680 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
1a690 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  r:.  sqlite3DbFr
1a6a0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61  ee(pParse->db, a
1a6b0 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  iMap);.  sqlite3
1a6c0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1a6d0 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64  b, zAff);.}.#end
1a6e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a6f0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
1a700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a710 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1a720 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  T./*.** Generate
1a730 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
1a740 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
1a750 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
1a760 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
1a770 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
1a780 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1a790 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
1a7a0 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
1a7b0 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
1a7c0 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
1a7d0 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
1a7e0 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
1a7f0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1a800 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
1a810 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
1a820 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
1a830 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
1a840 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
1a850 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
1a860 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
1a870 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
1a880 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
1a890 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
1a8a0 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
1a8b0 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69   value;.    sqli
1a8c0 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
1a8d0 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
1a8e0 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
1a8f0 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
1a900 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
1a910 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
1a920 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
1a930 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
1a940 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
1a950 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
1a960 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
1a970 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1a980 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
1a990 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1a9a0 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
1a9b0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
1a9c0 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
1a9d0 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
1a9e0 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
1a9f0 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
1aa00 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
1aa10 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1aa20 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e  Mem..**.** Expr.
1aa30 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61  u.zToken is alwa
1aa40 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f  ys UTF8 and zero
1aa50 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
1aa60 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
1aa70 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70  Integer(Parse *p
1aa80 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1aa90 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
1aaa0 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64   int iMem){.  Vd
1aab0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1aac0 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78  pVdbe;.  if( pEx
1aad0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
1aae0 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
1aaf0 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
1ab00 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65  iValue;.    asse
1ab10 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( i>=0 );.    
1ab20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
1ab30 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
1ab40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ab50 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
1ab60 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
1ab70 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34    int c;.    i64
1ab80 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73   value;.    cons
1ab90 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70  t char *z = pExp
1aba0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1abb0 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
1abc0 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
1abd0 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
1abe0 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
1abf0 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67 46  ( (c==3 && !negF
1ac00 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c  lag) || (c==2) |
1ac10 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61  | (negFlag && va
1ac20 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  lue==SMALLEST_IN
1ac30 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51  T64)){.#ifdef SQ
1ac40 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1ac50 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73  NG_POINT.      s
1ac60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ac70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65  Parse, "oversize
1ac80 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22  d integer: %s%s"
1ac90 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20  , negFlag ? "-" 
1aca0 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a  : "", z);.#else.
1acb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1acc0 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a  MIT_HEX_INTEGER.
1acd0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1ace0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78  3_strnicmp(z,"0x
1acf0 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
1ad00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ad10 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20  sg(pParse, "hex 
1ad20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a  literal too big:
1ad30 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f   %s%s", negFlag?
1ad40 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20  "-":"",z);.     
1ad50 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1ad60 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f      {.        co
1ad70 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
1ad80 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
1ad90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ada0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1adb0 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
1adc0 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c  e = c==3 ? SMALL
1add0 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c  EST_INT64 : -val
1ade0 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  ue; }.      sqli
1adf0 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
1ae00 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  8(v, OP_Int64, 0
1ae10 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
1ae20 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34  &value, P4_INT64
1ae30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1ae40 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 63 6f 6c 75  /*.** Erase colu
1ae50 6d 6e 2d 63 61 63 68 65 20 65 6e 74 72 79 20 6e  mn-cache entry n
1ae60 75 6d 62 65 72 20 69 0a 2a 2f 0a 73 74 61 74 69  umber i.*/.stati
1ae70 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72  c void cacheEntr
1ae80 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  yClear(Parse *pP
1ae90 61 72 73 65 2c 20 69 6e 74 20 69 29 7b 0a 20 20  arse, int i){.  
1aea0 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
1aeb0 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67  Cache[i].tempReg
1aec0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1aed0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
1aee0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
1aef0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
1af00 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
1af10 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
1af20 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d  Reg++] = pParse-
1af30 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
1af40 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  eg;.    }.  }.  
1af50 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1af60 65 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 70 50 61  e--;.  if( i<pPa
1af70 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
1af80 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43  {.    pParse->aC
1af90 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61  olCache[i] = pPa
1afa0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70  rse->aColCache[p
1afb0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1afc0 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ];.  }.}.../*.**
1afd0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63   Record in the c
1afe0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74  olumn cache that
1aff0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f   a particular co
1b000 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70  lumn from a.** p
1b010 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20  articular table 
1b020 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70  is stored in a p
1b030 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
1b040 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
1b050 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1b060 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1b070 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69   int iTab, int i
1b080 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  Col, int iReg){.
1b090 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
1b0a0 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78  inLru;.  int idx
1b0b0 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43  Lru;.  struct yC
1b0c0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f  olCache *p;..  /
1b0d0 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f  * Unless an erro
1b0e0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
1b0f0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
1b100 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
1b110 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tive. */.  asser
1b120 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61  t( iReg>0 || pPa
1b130 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61  rse->nErr || pPa
1b140 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1b150 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72  ailed );.  asser
1b160 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69  t( iCol>=-1 && i
1b170 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a  Col<32768 );  /*
1b180 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e   Finite column n
1b190 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  umbers */..  /* 
1b1a0 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  The SQLITE_Colum
1b1b0 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61  nCache flag disa
1b1c0 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  bles the column 
1b1d0 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20  cache.  This is 
1b1e0 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65  used.  ** for te
1b1f0 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20  sting only - to 
1b200 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69  verify that SQLi
1b210 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74  te always gets t
1b220 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
1b230 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74   ** with and wit
1b240 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  hout the column 
1b250 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
1b260 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
1b270 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  sabled(pParse->d
1b280 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  b, SQLITE_Column
1b290 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b  Cache) ) return;
1b2a0 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70  ..  /* First rep
1b2b0 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e  lace any existin
1b2c0 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20  g entry..  **.  
1b2d0 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
1b2e0 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20   way the column 
1b2f0 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74  cache is current
1b300 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20  ly used, we are 
1b310 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20  guaranteed.  ** 
1b320 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20  that the object 
1b330 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61  will never alrea
1b340 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20  dy be in cache. 
1b350 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61   Verify this gua
1b360 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66  rantee..  */.#if
1b370 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f  ndef NDEBUG.  fo
1b380 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1b390 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
1b3a0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1b3b0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1b3c0 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
1b3d0 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
1b3e0 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
1b3f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1b400 49 66 20 74 68 65 20 63 61 63 68 65 20 69 73 20  If the cache is 
1b410 61 6c 72 65 61 64 79 20 66 75 6c 6c 2c 20 64 65  already full, de
1b420 6c 65 74 65 20 74 68 65 20 6c 65 61 73 74 20 72  lete the least r
1b430 65 63 65 6e 74 6c 79 20 75 73 65 64 20 65 6e 74  ecently used ent
1b440 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ry */.  if( pPar
1b450 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3e 3d 53  se->nColCache>=S
1b460 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1b470 20 29 7b 0a 20 20 20 20 6d 69 6e 4c 72 75 20 3d   ){.    minLru =
1b480 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
1b490 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20   idxLru = -1;.  
1b4a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1b4b0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1b4c0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
1b4d0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
1b4e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75        if( p->lru
1b4f0 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20  <minLru ){.     
1b500 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20     idxLru = i;. 
1b510 20 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20         minLru = 
1b520 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 20 20 7d 0a  p->lru;.      }.
1b530 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70      }.    p = &p
1b540 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1b550 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73  [idxLru];.  }els
1b560 65 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72  e{.    p = &pPar
1b570 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50  se->aColCache[pP
1b580 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b  arse->nColCache+
1b590 2b 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  +];.  }..  /* Ad
1b5a0 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  d the new entry 
1b5b0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b5c0 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 70 2d 3e  e cache */.  p->
1b5d0 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
1b5e0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
1b5f0 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
1b600 3b 0a 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  ;.  p->iColumn =
1b610 20 69 43 6f 6c 3b 0a 20 20 70 2d 3e 69 52 65 67   iCol;.  p->iReg
1b620 20 3d 20 69 52 65 67 3b 0a 20 20 70 2d 3e 74 65   = iReg;.  p->te
1b630 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  mpReg = 0;.  p->
1b640 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
1b650 61 63 68 65 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a  acheCnt++;.}../*
1b660 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
1b670 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77  t registers betw
1b680 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e  een iReg..iReg+n
1b690 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20  Reg-1 are being 
1b6a0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20  overwritten..** 
1b6b0 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20  Purge the range 
1b6c0 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f  of registers fro
1b6d0 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
1b6e0 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  he..*/.void sqli
1b6f0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1b700 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1b710 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
1b720 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 20 3d  nReg){.  int i =
1b730 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 70   0;.  while( i<p
1b740 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1b750 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 79   ){.    struct y
1b760 43 6f 6c 43 61 63 68 65 20 2a 70 20 3d 20 26 70  ColCache *p = &p
1b770 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1b780 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
1b790 69 52 65 67 20 3e 3d 20 69 52 65 67 20 26 26 20  iReg >= iReg && 
1b7a0 70 2d 3e 69 52 65 67 20 3c 20 69 52 65 67 2b 6e  p->iReg < iReg+n
1b7b0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63  Reg ){.      cac
1b7c0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
1b7d0 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c  rse, i);.    }el
1b7e0 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  se{.      i++;. 
1b7f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b800 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
1b810 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61  urrent column ca
1b820 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e  che context.  An
1b830 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64  y new entries ad
1b840 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  ded.** added to 
1b850 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1b860 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c   after this call
1b870 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65   are removed whe
1b880 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  n the.** corresp
1b890 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72  onding pop occur
1b8a0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1b8b0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1b8c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1b8d0 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
1b8e0 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20  Level++;.#ifdef 
1b8f0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1b900 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
1b910 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
1b920 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
1b930 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48      printf("PUSH
1b940 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
1b950 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
1b960 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
1b970 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
1b980 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b990 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
1b9a0 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
1b9b0 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
1b9c0 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45  revious sqlite3E
1b9d0 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65  xprCachePush ope
1b9e0 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  ration.  In othe
1b9f0 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65  r words, restore
1ba00 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f  .** the cache to
1ba10 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
1ba20 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d  s in prior the m
1ba30 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e  ost recent Push.
1ba40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ba50 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72  ExprCachePop(Par
1ba60 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
1ba70 6e 74 20 69 20 3d 20 30 3b 0a 20 20 61 73 73 65  nt i = 0;.  asse
1ba80 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1ba90 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20  heLevel>=1 );.  
1baa0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1bab0 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51  vel--;.#ifdef SQ
1bac0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1bad0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1bae0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1baf0 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
1bb00 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74    printf("POP  t
1bb10 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
1bb20 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
1bb30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
1bb40 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e( i<pParse->nCo
1bb50 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 69 66  lCache ){.    if
1bb60 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  ( pParse->aColCa
1bb70 63 68 65 5b 69 5d 2e 69 4c 65 76 65 6c 3e 70 50  che[i].iLevel>pP
1bb80 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1bb90 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  l ){.      cache
1bba0 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
1bbb0 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, i);.    }else
1bbc0 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
1bbd0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1bbe0 57 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f  When a cached co
1bbf0 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20  lumn is reused, 
1bc00 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69  make sure that i
1bc10 74 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ts register is.*
1bc20 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69  * no longer avai
1bc30 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20  lable as a temp 
1bc40 72 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65  register.  ticke
1bc50 74 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73  t #3879:  that s
1bc60 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ame.** register 
1bc70 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20  might be in the 
1bc80 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c  cache in multipl
1bc90 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20  e places, so be 
1bca0 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74  sure to.** get t
1bcb0 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  hem all..*/.stat
1bcc0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
1bcd0 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
1bce0 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ter(Parse *pPars
1bcf0 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
1bd00 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1bd10 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
1bd20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1bd30 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1bd40 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1bd50 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1bd60 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
1bd70 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Reg ){.      p->
1bd80 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
1bd90 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e   }.  }.}../* Gen
1bda0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1bdb0 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72  will load into r
1bdc0 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61  egister regOut a
1bdd0 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
1bde0 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  * appropriate fo
1bdf0 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68  r the iIdxCol-th
1be00 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
1be10 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73   pIdx..*/.void s
1be20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f  qlite3ExprCodeLo
1be30 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20  adIndexColumn(. 
1be40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1be50 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1be60 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
1be70 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20  ex *pIdx,    /* 
1be80 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
1be90 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20  column is to be 
1bea0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1beb0 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43  iTabCur,    /* C
1bec0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1bed0 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f  o a table row */
1bee0 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20  .  int iIdxCol, 
1bef0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
1bf00 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
1bf10 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
1bf20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1bf30 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64  /* Store the ind
1bf40 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  ex column value 
1bf50 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1bf60 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61   */.){.  i16 iTa
1bf70 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  bCol = pIdx->aiC
1bf80 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a  olumn[iIdxCol];.
1bf90 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58    if( iTabCol==X
1bfa0 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73  N_EXPR ){.    as
1bfb0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
1bfc0 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65  Expr );.    asse
1bfd0 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
1bfe0 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f  pr->nExpr>iIdxCo
1bff0 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  l );.    pParse-
1c000 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62  >iSelfTab = iTab
1c010 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c  Cur + 1;.    sql
1c020 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
1c030 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
1c040 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43  ColExpr->a[iIdxC
1c050 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75  ol].pExpr, regOu
1c060 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  t);.    pParse->
1c070 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20  iSelfTab = 0;.  
1c080 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1c090 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1c0a0 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73  umnOfTable(pPars
1c0b0 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e  e->pVdbe, pIdx->
1c0c0 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c  pTable, iTabCur,
1c0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65       iTabCol, re
1c100 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
1c110 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c120 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
1c130 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43   value of the iC
1c140 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
1c150 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
1c160 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c170 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1c180 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
1c190 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1c1a0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1c1b0 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  on */.  Table *p
1c1c0 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Tab,    /* The t
1c1d0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1c1e0 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  the value */.  i
1c1f0 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
1c200 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73  * The table curs
1c210 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63  or.  Or the PK c
1c220 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55  ursor for WITHOU
1c230 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74  T ROWID */.  int
1c240 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20   iCol,       /* 
1c250 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
1c260 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a  umn to extract *
1c270 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
1c280 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
1c290 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  he value into th
1c2a0 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1c2b0 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  {.  if( pTab==0 
1c2c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1c2d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1c2e0 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20  olumn, iTabCur, 
1c2f0 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
1c300 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1c310 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
1c320 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
1c330 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1c340 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c350 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
1c360 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
1c370 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
1c380 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
1c390 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
1c3a0 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  _Column;.    int
1c3b0 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69   x = iCol;.    i
1c3c0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1c3d0 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  b) && !IsVirtual
1c3e0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1c3f0 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
1c400 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
1c410 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1c420 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
1c430 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1c440 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1c450 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
1c460 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
1c470 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
1c480 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
1c490 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
1c4a0 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1c4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1c4c0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1c4d0 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
1c4e0 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
1c4f0 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
1c500 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
1c510 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1c520 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a  a register. .**.
1c530 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20  ** An effort is 
1c540 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
1c550 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1c560 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
1c570 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74    This.** is not
1c580 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20   garanteeed for 
1c590 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68  GetColumn() - th
1c5a0 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20  e result can be 
1c5b0 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79  stored in.** any
1c5c0 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74 20   register.  But 
1c5d0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75  the result is gu
1c5e0 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64  aranteed to land
1c5f0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1c600 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75  g.** for GetColu
1c610 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a  mnToReg()..**.**
1c620 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1c630 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
1c640 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
1c650 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1c660 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
1c670 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
1c680 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
1c690 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
1c6a0 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
1c6b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1c6c0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
1c6d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1c6e0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1c6f0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1c700 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1c710 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1c720 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1c730 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1c740 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1c750 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1c760 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1c770 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1c780 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1c790 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1c7a0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1c7b0 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1c7c0 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
1c7d0 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1c7e0 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
1c7f0 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
1c800 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
1c810 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20  _Column + FLAGS 
1c820 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1c830 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c840 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1c850 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1c860 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
1c870 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1c880 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
1c890 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29  Cache; i++, p++)
1c8a0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
1c8b0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
1c8c0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
1c8d0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
1c8e0 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
1c8f0 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
1c900 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c910 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
1c920 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
1c930 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
1c940 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
1c950 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
1c960 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1c970 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1c980 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
1c990 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
1c9a0 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
1c9b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c9c0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
1c9d0 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20  .  }else{   .   
1c9e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c9f0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1ca00 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
1ca10 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iReg);.  }.  ret
1ca20 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64  urn iReg;.}.void
1ca30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ca40 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a  GetColumnToReg(.
1ca50 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ca60 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
1ca70 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1ca80 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
1ca90 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
1caa0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1cab0 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
1cac0 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
1cad0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1cae0 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
1caf0 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
1cb00 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
1cb10 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
1cb20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
1cb30 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
1cb40 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
1cb50 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
1cb60 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
1cb70 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
1cb80 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1cb90 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
1cba0 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65   iColumn, iTable
1cbb0 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66  , iReg, 0);.  if
1cbc0 28 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c  ( r1!=iReg ) sql
1cbd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1cbe0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1cbf0 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67  _SCopy, r1, iReg
1cc00 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  );.}.../*.** Cle
1cc10 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
1cc20 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
1cc30 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1cc40 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
1cc50 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
1cc60 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   i;..#ifdef SQLI
1cc70 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1cc80 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1cc90 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1cca0 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1ccb0 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22  printf("CLEAR\n"
1ccc0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1ccd0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
1cce0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1ccf0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72  +){.    if( pPar
1cd00 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1cd10 2e 74 65 6d 70 52 65 67 0a 20 20 20 20 20 26 26  .tempReg.     &&
1cd20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1cd30 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
1cd40 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 0a 20 20  se->aTempReg).  
1cd50 20 20 29 7b 0a 20 20 20 20 20 20 20 70 50 61 72    ){.       pPar
1cd60 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
1cd70 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
1cd80 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   = pParse->aColC
1cd90 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20  ache[i].iReg;.  
1cda0 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65    }.  }.  pParse
1cdb0 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b  ->nColCache = 0;
1cdc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
1cdd0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
1cde0 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
1cdf0 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
1ce00 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
1ce10 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
1ce20 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
1ce30 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1ce40 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1ce50 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1ce60 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
1ce70 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c  t iCount){.  sql
1ce80 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1ce90 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61  ove(pParse, iSta
1cea0 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a  rt, iCount);.}..
1ceb0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1cec0 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
1ced0 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
1cee0 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
1cef0 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
1cf00 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
1cf10 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c  -1. Keep the col
1cf20 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d  umn cache up-to-
1cf30 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  date..*/.void sq
1cf40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
1cf50 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1cf60 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
1cf70 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
1cf80 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e    assert( iFrom>
1cf90 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72  =iTo+nReg || iFr
1cfa0 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a  om+nReg<=iTo );.
1cfb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cfc0 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
1cfd0 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
1cfe0 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20  m, iTo, nReg);. 
1cff0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d000 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1d010 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a  iFrom, nReg);.}.
1d020 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1d030 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
1d040 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
1d050 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  ERAGE_TEST)./*.*
1d060 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1d070 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e   any register in
1d080 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d   the range iFrom
1d090 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65  ..iTo (inclusive
1d0a0 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20  ).** is used as 
1d0b0 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  part of the colu
1d0c0 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  mn cache..**.** 
1d0d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1d0e0 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65  used within asse
1d0f0 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73  rt() and testcas
1d100 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a  e() macros only.
1d110 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ** and does not 
1d120 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d  appear in a norm
1d130 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  al build..*/.sta
1d140 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f  tic int usedAsCo
1d150 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
1d160 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
1d170 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
1d180 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1d190 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
1d1a0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1d1b0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1d1c0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1d1d0 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1d1e0 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65    int r = p->iRe
1d1f0 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46  g;.    if( r>=iF
1d200 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20  rom && r<=iTo ) 
1d210 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e  return 1;    /*N
1d220 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72  O_TEST*/.  }.  r
1d230 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1d240 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1d250 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45  G || SQLITE_COVE
1d260 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f  RAGE_TEST */.../
1d270 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73  *.** Convert a s
1d280 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
1d290 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45   node to a TK_RE
1d2a0 47 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69  GISTER referenci
1d2b0 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  ng.** register i
1d2c0 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  Reg.  The caller
1d2d0 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
1d2e0 74 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63  t iReg already c
1d2f0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63  ontains.** the c
1d300 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1d310 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
1d320 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d330 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45  exprToRegister(E
1d340 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67  xpr *p, int iReg
1d350 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d  ){.  p->op2 = p-
1d360 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  >op;.  p->op = T
1d370 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d  K_REGISTER;.  p-
1d380 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a  >iTable = iReg;.
1d390 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
1d3a0 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b  rty(p, EP_Skip);
1d3b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61  .}../*.** Evalua
1d3c0 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
1d3d0 20 28 65 69 74 68 65 72 20 61 20 76 65 63 74 6f   (either a vecto
1d3e0 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78  r or a scalar ex
1d3f0 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74  pression) and st
1d400 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ore.** the resul
1d410 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73  t in continguous
1d420 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1d430 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ters.  Return th
1d440 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
1d450 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
1d460 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
1d470 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
1d480 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
1d490 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
1d4a0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
1d4b0 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73  scalar, then als
1d4c0 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20  o write.** that 
1d4d0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
1d4e0 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65  into *piFreeable
1d4f0 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1d500 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  ed result regist
1d510 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74  er.** is not a t
1d520 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74  emporary or if t
1d530 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1d540 20 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70   a vector set *p
1d550 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20  iFreeable.** to 
1d560 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
1d570 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
1d580 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1d590 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46  xpr *p, int *piF
1d5a0 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  reeable){.  int 
1d5b0 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e  iResult;.  int n
1d5c0 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1d5d0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
1d5e0 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74  );.  if( nResult
1d5f0 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75  ==1 ){.    iResu
1d600 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1d610 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1d620 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b   p, piFreeable);
1d630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
1d640 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20  iFreeable = 0;. 
1d650 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
1d660 5f 53 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53  _SELECT ){.#if S
1d670 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1d680 45 52 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c  ERY.      iResul
1d690 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20  t = 0;.#else.   
1d6a0 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c     iResult = sql
1d6b0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
1d6c0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20  t(pParse, p, 0, 
1d6d0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
1d6e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1d6f0 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74  i;.      iResult
1d700 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1d710 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
1d720 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
1d730 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1d740 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29   i<nResult; i++)
1d750 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d760 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
1d770 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78  ble(pParse, p->x
1d780 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
1d790 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a  pr, i+iResult);.
1d7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d7b0 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 75  }.  return iResu
1d7c0 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  lt;.}.../*.** Ge
1d7d0 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
1d7e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
1d7f0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1d800 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
1d810 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20  ssion.  Attempt 
1d820 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
1d830 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1d840 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65   "target"..** Re
1d850 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
1d860 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20  r where results 
1d870 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
1d880 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74  * With this rout
1d890 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ine, there is no
1d8a0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
1d8b0 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
1d8c0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
1d8d0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
1d8e0 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
1d8f0 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
1d900 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
1d910 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
1d920 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
1d930 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
1d940 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
1d950 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
1d960 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
1d970 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
1d980 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
1d990 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1d9a0 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65  CodeTarget(Parse
1d9b0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1d9c0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1d9d0 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1d9e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
1d9f0 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20  /* The VM under 
1da00 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1da10 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1da20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1da30 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
1da40 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
1da50 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20  nReg = target;  
1da60 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
1da70 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
1da80 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e  er inReg */.  in
1da90 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
1daa0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
1dab0 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
1dac0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1dad0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
1dae0 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20  Free2 = 0;      
1daf0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1db00 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1db10 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1db20 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20  /.  int r1, r2; 
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db40 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65   Various registe
1db50 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45  r numbers */.  E
1db60 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20  xpr tempX;      
1db70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
1db80 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  orary expression
1db90 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70   node */.  int p
1dba0 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  5 = 0;..  assert
1dbb0 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
1dbc0 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
1dbd0 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
1dbe0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1dbf0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1dc00 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1dc10 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1dc20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
1dc30 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
1dc40 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
1dc50 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1dc60 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
1dc70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1dc80 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
1dc90 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
1dca0 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
1dcb0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
1dcc0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1dcd0 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
1dce0 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
1dcf0 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
1dd00 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
1dd10 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
1dd20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
1dd30 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
1dd40 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e     return pCol->
1dd50 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iMem;.      }els
1dd60 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
1dd70 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
1dd80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1dd90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1dda0 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
1ddb0 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
1ddc0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dde0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1ddf0 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1de00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1de10 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
1de20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
1de30 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
1de40 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
1de50 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
1de60 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1de70 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
1de80 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
1de90 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  e;.      if( iTa
1dea0 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  b<0 ){.        i
1deb0 66 28 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66  f( pParse->iSelf
1dec0 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Tab<0 ){.       
1ded0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67     /* Generating
1dee0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
1def0 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  ts or inserting 
1df00 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64  into partial ind
1df10 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
1df20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43  return pExpr->iC
1df30 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e  olumn - pParse->
1df40 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20  iSelfTab;.      
1df50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1df60 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20     /* Coding an 
1df70 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1df80 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  is part of an in
1df90 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e  dex where column
1dfa0 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20   names.         
1dfb0 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1dfc0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
1dfd0 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ble to which the
1dfe0 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a   index belongs *
1dff0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62  /.          iTab
1e000 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   = pParse->iSelf
1e010 54 61 62 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  Tab - 1;.       
1e020 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1e030 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
1e040 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1e050 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e060 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  pTab,.          
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
1e090 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65  umn, iTab, targe
1e0a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20    pExpr->op2);. 
1e0d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e0e0 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1e0f0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1e100 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
1e110 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1e120 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e130 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1e140 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1e150 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
1e160 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
1e170 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e180 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e190 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e1a0 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
1e1b0 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
1e1c0 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
1e1d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e1e0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1e1f0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
1e200 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
1e210 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1e220 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e230 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1e240 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e250 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
1e260 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  rget, pExpr->u.z
1e270 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65  Token);.      re
1e280 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e290 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1e2a0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
1e2b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e2c0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1e2d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1e2e0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e2f0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e300 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1e310 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1e320 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
1e330 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
1e340 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
1e350 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
1e360 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e370 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e380 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e390 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e3a0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e3b0 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
1e3c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1e3d0 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
1e3e0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1e3f0 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
1e400 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
1e410 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
1e420 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
1e430 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
1e440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1e450 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
1e460 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
1e470 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
1e480 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
1e490 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
1e4a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1e4b0 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
1e4c0 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
1e4d0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
1e4e0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e4f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1e500 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
1e510 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
1e520 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e530 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e540 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e550 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e560 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
1e570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e580 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1e590 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
1e5a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e5b0 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
1e5c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1e5d0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1e5e0 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
1e5f0 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
1e600 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e610 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  z = sqlite3VList
1e620 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65  NumToName(pParse
1e630 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d  ->pVList, pExpr-
1e640 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1e650 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e660 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1e670 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78  ?' || strcmp(pEx
1e680 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29  pr->u.zToken, z)
1e690 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1e6a0 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d  Parse->pVList[0]
1e6b0 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74   = 0; /* Indicat
1e6c0 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c  e VList may no l
1e6d0 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65  onger be enlarge
1e6e0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  d */.        sql
1e6f0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
1e700 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34  (v, (char*)z, P4
1e710 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1e720 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  }.      return t
1e730 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1e740 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1e750 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
1e760 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  n pExpr->iTable;
1e770 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e780 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1e790 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1e7a0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1e7b0 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1e7c0 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1e7d0 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1e7e0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1e7f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1e800 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1e810 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1e820 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1e830 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1e840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1e860 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1e870 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
1e880 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1e890 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e8a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e8b0 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
1e8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e8d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e8e0 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1e8f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
1e900 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e910 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
1e920 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
1e930 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
1e940 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e950 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1e960 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
1e970 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 1);.      retu
1e980 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a  rn inReg;.    }.
1e990 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e9a0 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
1e9b0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1e9c0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1e9d0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
1e9e0 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
1e9f0 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70  : TK_NE;.      p
1ea00 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  5 = SQLITE_NULLE
1ea10 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c  Q;.      /* fall
1ea20 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20  -through */.    
1ea30 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1ea40 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1ea50 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1ea60 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1ea70 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1ea80 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1ea90 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1eaa0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1eab0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1eac0 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c  3ExprIsVector(pL
1ead0 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
1eae0 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72  codeVectorCompar
1eaf0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
1eb00 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29   target, op, p5)
1eb10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1eb20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1eb30 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1eb40 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
1eb50 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1eb60 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1eb70 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1eb80 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1eb90 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1eba0 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
1ebb0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
1ebc0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ebd0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1ebe0 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
1ebf0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c  SQLITE_STOREP2 |
1ec00 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73   p5);.        as
1ec10 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
1ec20 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1ec30 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
1ec40 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1ec50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Lt);.        as
1ec60 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
1ec70 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1ec80 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
1ec90 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1eca0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Le);.        as
1ecb0 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
1ecc0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1ecd0 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
1ece0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1ecf0 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Gt);.        as
1ed00 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
1ed10 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1ed20 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
1ed30 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1ed40 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Ge);.        as
1ed50 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
1ed60 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
1ed70 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
1ed80 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1ed90 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Eq);.        as
1eda0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
1edb0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1edc0 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
1edd0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1ede0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  _Ne);.        te
1edf0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1ee00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
1ee10 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1ee20 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
1ee30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ee40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1ee50 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
1ee60 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1ee70 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
1ee80 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
1ee90 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
1eea0 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
1eeb0 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
1eec0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
1eed0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
1eee0 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
1eef0 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
1ef00 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
1ef10 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
1ef20 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1ef30 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
1ef40 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d );            
1ef50 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ef60 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  _AND );.      as
1ef70 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
1ef80 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  Or );           
1ef90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1efa0 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
1efb0 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
1efc0 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20  =OP_Add );      
1efd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1efe0 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
1eff0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
1f000 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
1f010 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73  t );     testcas
1f020 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
1f030 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f040 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
1f050 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65  inder );      te
1f060 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1f070 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
1f080 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
1f090 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20  P_BitAnd );     
1f0a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f0b0 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
1f0c0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1f0d0 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20  OR==OP_BitOr ); 
1f0e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f0f0 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b   op==TK_BITOR );
1f100 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f110 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
1f120 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74  de );       test
1f130 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41  case( op==TK_SLA
1f140 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  SH );.      asse
1f150 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
1f160 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20  P_ShiftLeft );  
1f170 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f180 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
1f190 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
1f1a0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
1f1b0 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  ht );  testcase(
1f1c0 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
1f1d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f1e0 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f  TK_CONCAT==OP_Co
1f1f0 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73  ncat );      tes
1f200 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
1f210 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
1f220 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f230 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f240 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1f250 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1f260 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1f270 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f280 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1f290 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1f2a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f2b0 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
1f2c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f2d0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f2e0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f2f0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f300 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1f310 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f320 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
1f330 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
1f340 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
1f350 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
1f360 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
1f370 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1f380 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
1f390 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1f3a0 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
1f3b0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1f3c0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1f3d0 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  et;.#ifndef SQLI
1f3e0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1f3f0 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
1f400 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
1f410 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
1f420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1f430 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1f440 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1f450 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
1f460 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
1f470 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
1f480 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
1f490 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65  eturn target;.#e
1f4a0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
1f4b0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  {.        tempX.
1f4c0 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b  op = TK_INTEGER;
1f4d0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66  .        tempX.f
1f4e0 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c  lags = EP_IntVal
1f4f0 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b  ue|EP_TokenOnly;
1f500 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75  .        tempX.u
1f510 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  .iValue = 0;.   
1f520 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1f530 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f540 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
1f550 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1f560 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f570 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f580 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f590 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f5a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f5b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
1f5c0 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
1f5d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1f5e0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f5f0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1f600 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f610 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f620 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
1f630 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1f640 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
1f650 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
1f660 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f670 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
1f680 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1f690 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20  OT==OP_Not );   
1f6a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f6b0 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
1f6c0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f6d0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f6e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f6f0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f700 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f710 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1f720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f730 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
1f740 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
1f750 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f760 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1f770 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1f780 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
1f790 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
1f7a0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
1f7b0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
1f7c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f7d0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1f7e0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
1f7f0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
1f800 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
1f810 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
1f820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f830 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1f840 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
1f850 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1f860 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f870 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f880 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1f890 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f8a0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f8b0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
1f8c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1f8d0 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
1f8e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f8f0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
1f900 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
1f910 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1f920 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
1f930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f940 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1f950 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
1f960 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f970 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1f980 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
1f990 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f9a0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
1f9b0 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
1f9c0 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
1f9d0 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
1f9e0 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
1f9f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fa00 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1fa10 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1fa20 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
1fa30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1fa40 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
1fa50 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
1fa60 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
1fa70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
1fa80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1fa90 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  urn pInfo->aFunc
1faa0 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
1fab0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
1fac0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fad0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1fae0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
1faf0 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
1fb00 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1fb10 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1fb20 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
1fb30 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  Farg;           
1fb40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
1fb50 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1fb60 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  s */.      FuncD
1fb70 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
1fb80 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
1fb90 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a  n definition obj
1fba0 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ect */.      con
1fbb0 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
1fbc0 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
1fbd0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
1fbe0 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20    u32 constMask 
1fbf0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
1fc00 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1fc10 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
1fc20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
1fc30 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1fc40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1fc50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1fc60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1fc70 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
1fc80 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
1fc90 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  nection */.     
1fca0 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
1fcb0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
1fcc0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
1fcd0 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
1fce0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
1fcf0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
1fd00 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
1fd10 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
1fd20 20 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61       if( ConstFa
1fd30 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26  ctorOk(pParse) &
1fd40 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1fd50 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
1fd60 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1fd70 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   /* SQL function
1fd80 73 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69  s can be expensi
1fd90 76 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f  ve. So try to mo
1fda0 76 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63  ve constant func
1fdb0 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a  tions.        **
1fdc0 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
1fdd0 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20  r loop, even if 
1fde0 74 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78  that means an ex
1fdf0 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a  tra OP_Copy. */.
1fe00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1fe10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1fe20 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1fe30 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  pr, -1);.      }
1fe40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1fe50 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1fe60 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1fe70 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
1fe80 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1fe90 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1fea0 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
1feb0 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
1fec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fed0 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
1fee0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
1fef0 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20  }.      nFarg = 
1ff00 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e  pFarg ? pFarg->n
1ff10 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
1ff20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ff30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ff40 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1ff50 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
1ff60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1ff70 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
1ff80 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
1ff90 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e  , zId, nFarg, en
1ffa0 63 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  c, 0);.#ifdef SQ
1ffb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e  LITE_ENABLE_UNKN
1ffc0 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e  OWN_SQL_FUNCTION
1ffd0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
1ffe0 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78  =0 && pParse->ex
1fff0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
20000 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
20010 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
20020 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67  "unknown", nFarg
20030 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
20040 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20050 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70  if( pDef==0 || p
20060 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d  Def->xFinalize!=
20070 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
20080 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20090 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75  rse, "unknown fu
200a0 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a  nction: %s()", z
200b0 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Id);.        bre
200c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
200d0 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20     /* Attempt a 
200e0 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  direct implement
200f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
20100 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29  lt-in COALESCE()
20110 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46   and.      ** IF
20120 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73  NULL() functions
20130 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75  .  This avoids u
20140 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75  nnecessary evalu
20150 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a  ation of.      *
20160 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74  * arguments past
20170 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e   the first non-N
20180 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  ULL argument..  
20190 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
201a0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
201b0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   & SQLITE_FUNC_C
201c0 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20  OALESCE ){.     
201d0 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73     int endCoales
201e0 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
201f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
20210 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20  arg>=2 );.      
20220 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20230 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
20240 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
20250 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  get);.        fo
20260 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=1; i<nFarg; 
20270 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
20280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20290 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
202a0 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c   target, endCoal
202b0 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  esce);.         
202c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
202d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
202e0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
202f0 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  ve(pParse, targe
20300 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 1);.         
20310 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
20320 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
20330 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20340 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
20350 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
20360 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
20370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20380 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
20390 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
203a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
203b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
203c0 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
203d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
203e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
203f0 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66  The UNLIKELY() f
20400 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
20410 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  op.  The result 
20420 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  is the value.   
20430 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
20440 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
20450 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20460 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20470 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
20480 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
20490 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
204a0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =1 );.        re
204b0 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
204c0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
204d0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
204e0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
204f0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
20500 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
20510 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54    /* The AFFINIT
20520 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61  Y() function eva
20530 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72 69  luates to a stri
20540 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
20550 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74  s.      ** the t
20560 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  ype affinity of 
20570 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  the argument.  T
20580 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
20590 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20  testing of.     
205a0 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74   ** the SQLite t
205b0 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20  ype logic..     
205c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
205d0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
205e0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49  SQLITE_FUNC_AFFI
205f0 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20  NITY ){.        
20600 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66  const char *azAf
20610 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20  f[] = { "blob", 
20620 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63  "text", "numeric
20630 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72  ", "integer", "r
20640 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20  eal" };.        
20650 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20  char aff;.      
20660 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
20670 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66  =1 );.        af
20680 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
20690 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61  ffinity(pFarg->a
206a0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
206b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
206c0 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
206d0 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  get, .          
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206f0 20 20 20 20 61 66 66 20 3f 20 61 7a 41 66 66 5b      aff ? azAff[
20700 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  aff-SQLITE_AFF_B
20710 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a  LOB] : "none");.
20720 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
20730 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 23  arget;.      }.#
20740 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f 72  endif..      for
20750 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=0; i<nFarg; i
20760 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
20770 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33   i<32 && sqlite3
20780 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
20790 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
207a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
207b0 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29  estcase( i==31 )
207c0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
207d0 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  tMask |= MASKBIT
207e0 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  32(i);.        }
207f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
20800 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20810 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
20820 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
20830 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
20840 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
20850 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
20860 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
20870 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
20880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20890 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
208a0 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73      if( constMas
208b0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  k ){.          r
208c0 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
208d0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +1;.          pP
208e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46  arse->nMem += nF
208f0 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  arg;.        }el
20900 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31  se{.          r1
20910 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
20920 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
20930 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Farg);.        }
20940 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  ..        /* For
20950 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79   length() and ty
20960 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73  peof() functions
20970 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
20980 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  rgument,.       
20990 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70   ** set the P5 p
209a0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20  arameter to the 
209b0 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
209c0 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   to OPFLAG_LENGT
209d0 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20  HARG.        ** 
209e0 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  or OPFLAG_TYPEOF
209f0 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79  ARG respectively
20a00 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  , to avoid unnec
20a10 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20  essary data.    
20a20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a      ** loading..
20a30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
20a40 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
20a50 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ncFlags & (SQLIT
20a60 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51  E_FUNC_LENGTH|SQ
20a70 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
20a80 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
20a90 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20     u8 exprOp;.  
20aa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20ab0 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
20ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
20ad0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  arg->a[0].pExpr!
20ae0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
20af0 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e  exprOp = pFarg->
20b00 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a  a[0].pExpr->op;.
20b10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
20b20 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  prOp==TK_COLUMN 
20b30 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47  || exprOp==TK_AG
20b40 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
20b50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20b60 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
20b70 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  TH==OPFLAG_LENGT
20b80 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
20b90 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
20ba0 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d  TE_FUNC_TYPEOF==
20bb0 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
20bc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
20bd0 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e  testcase( pDef->
20be0 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c  funcFlags & OPFL
20bf0 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
20c00 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72              pFar
20c10 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
20c20 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  p2 = .          
20c30 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75          pDef->fu
20c40 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41  ncFlags & (OPFLA
20c50 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c  G_LENGTHARG|OPFL
20c60 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
20c70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20c80 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71     }..        sq
20c90 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
20ca0 73 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  sh(pParse);     
20cb0 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
20cc0 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
20cd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20ce0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
20cf0 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a  , pFarg, r1, 0,.
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c  SQLITE_ECEL_DUP|
20d30 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
20d40 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  OR);.        sql
20d50 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
20d60 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f  (pParse);      /
20d70 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
20d80 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d  d34be */.      }
20d90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
20da0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
20db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20dc0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
20dd0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
20de0 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
20df0 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69  nction if the fi
20e00 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  rst argument is.
20e10 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75        ** a virtu
20e20 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  al table column.
20e30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
20e40 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e  ** For infix fun
20e50 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c  ctions (LIKE, GL
20e60 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20  OB, REGEXP, and 
20e70 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20  MATCH) use the. 
20e80 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61       ** second a
20e90 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65  rgument, not the
20ea0 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61   first, as the a
20eb0 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20  rgument to test 
20ec0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
20ed0 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d  if it is a colum
20ee0 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74  n in a virtual t
20ef0 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64  able.  This is d
20f00 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20  one because.    
20f10 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70    ** the left op
20f20 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66  erand of infix f
20f30 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70  unctions (the op
20f40 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  erand we want to
20f50 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f  .      ** contro
20f60 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65  l overloading) e
20f70 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65  nds up as the se
20f80 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
20f90 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75   the.      ** fu
20fa0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70  nction.  The exp
20fb0 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20  ression "A glob 
20fc0 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  B" is equivalent
20fd0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67   to .      ** "g
20fe0 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61  lob(B,A).  We wa
20ff0 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20  nt to use the A 
21000 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f  in "A glob B" to
21010 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66   test.      ** f
21020 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72  or function over
21030 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65  loading.  But we
21040 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20   use the B term 
21050 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a  in "glob(B,A)"..
21060 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21070 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28  f( nFarg>=2 && (
21080 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
21090 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a  P_InfixFunc) ){.
210a0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
210b0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
210c0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
210d0 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
210e0 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  g->a[1].pExpr);.
210f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21100 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20  nFarg>0 ){.     
21110 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
21120 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
21130 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
21140 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
21150 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
21160 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
21170 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21180 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21190 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
211a0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
211b0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
211c0 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
211d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
211e0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
211f0 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
21200 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
21210 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
21220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21230 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72  beAddOp4(v, pPar
21240 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f  se->iSelfTab ? O
21250 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50  P_PureFunc0 : OP
21260 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20  _Function0,.    
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72      constMask, r
21290 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61 72  1, target, (char
212a0 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
212b0 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
212c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
212d0 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20  , (u8)nFarg);.  
212e0 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26      if( nFarg &&
212f0 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b   constMask==0 ){
21300 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21310 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
21320 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
21330 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
21340 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
21350 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
21360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21370 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
21380 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
21390 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
213a0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
213b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
213c0 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
213d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
213e0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
213f0 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
21400 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f  K_SELECT && (nCo
21410 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
21420 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
21430 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  xpr)!=1 ){.     
21440 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
21450 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
21460 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20   nCol, 1);.     
21470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21480 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f  return sqlite3Co
21490 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
214a0 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
214b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
214c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
214d0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f   case TK_SELECT_
214e0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
214f0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28  int n;.      if(
21500 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
21510 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
21520 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
21530 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
21540 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
21550 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
21560 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
21570 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
21580 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
21590 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
215a0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  eft->op==TK_SELE
215b0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
215c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
215d0 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69       && pExpr->i
215e0 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69  Table!=(n = sqli
215f0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
21600 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29  e(pExpr->pLeft))
21610 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
21620 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21630 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
21640 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
21650 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21670 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21680 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20  r->iTable, n);. 
21690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
216a0 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  urn pExpr->pLeft
216b0 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72  ->iTable + pExpr
216c0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  ->iColumn;.    }
216d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
216e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
216f0 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
21700 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21710 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
21720 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
21730 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21740 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
21750 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21760 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
21770 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
21780 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
21790 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
217a0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
217b0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
217c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
217d0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
217e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
217f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
21800 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
21810 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
21820 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21830 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
21840 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
21850 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
21860 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
21870 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Null);.      ret
21880 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
21890 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
218a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
218b0 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20   */...    /*.   
218c0 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
218d0 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
218e0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
218f0 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
21900 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
21910 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
21920 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
21930 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21940 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
21950 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
21960 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
21970 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
21980 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
21990 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
219a0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
219b0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
219c0 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43  N: {.      exprC
219d0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
219e0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
219f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  , 0, 0);.      r
21a00 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
21a10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21a20 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  SPAN:.    case T
21a30 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20  K_COLLATE: .    
21a40 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
21a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
21a60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
21a70 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
21a80 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
21a90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  );.    }..    ca
21aa0 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
21ab0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
21ac0 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
21ad0 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
21ae0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
21af0 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
21b00 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
21b10 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
21b20 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
21b30 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
21b40 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
21b50 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
21b60 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
21b70 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
21b80 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
21b90 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
21ba0 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
21bb0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
21bc0 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
21bd0 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
21be0 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
21bf0 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
21c00 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
21c10 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
21c20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
21c30 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
21c40 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
21c50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
21c60 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
21c70 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
21c80 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
21c90 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
21ca0 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
21cb0 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
21cc0 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
21cd0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
21ce0 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
21cf0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
21d00 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
21d10 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
21d20 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
21d30 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
21d40 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
21d50 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
21d60 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
21d70 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
21d80 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
21d90 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
21da0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
21db0 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
21dc0 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
21dd0 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
21de0 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
21df0 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
21e00 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
21e10 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
21e20 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
21e30 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
21e40 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
21e50 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
21e60 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
21e70 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
21e80 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
21e90 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
21ea0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
21eb0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
21ec0 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
21ed0 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
21ee0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
21ef0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
21f00 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
21f10 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
21f20 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
21f30 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
21f40 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
21f50 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
21f60 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
21f70 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
21f80 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
21f90 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
21fa0 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
21fb0 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
21fc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21fd0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
21fe0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
21ff0 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
22000 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
22010 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
22020 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
22030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
22040 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
22050 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
22060 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
22070 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
22080 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
22090 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
220a0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
220b0 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
220c0 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
220d0 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
220e0 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
220f0 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
22100 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
22110 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
22120 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22130 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
22140 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
22150 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
22160 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
22170 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
22180 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
22190 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
221a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
221b0 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
221c0 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
221d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
221e0 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
221f0 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
22200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22210 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
22220 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
22230 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
22240 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
22250 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
22260 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
22270 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
22280 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
22290 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
222a0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
222b0 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  l..      **.    
222c0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
222d0 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20  : R-60985-57662 
222e0 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76  SQLite will conv
222f0 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61  ert the value ba
22300 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  ck to.      ** f
22310 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68  loating point wh
22320 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74  en extracting it
22330 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
22340 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
22350 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
22360 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
22370 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
22380 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
22390 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
223a0 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
223b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
223c0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
223d0 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
223e0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
223f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22400 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
22410 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20  _VECTOR: {.     
22420 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
22430 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
22440 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
22450 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22460 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  }..    case TK_I
22470 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20  F_NULL_ROW: {.  
22480 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52 3b      int addrINR;
22490 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52 20 3d  .      addrINR =
224a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
224b0 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52  p1(v, OP_IfNullR
224c0 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ow, pExpr->iTabl
224d0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
224e0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
224f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
22500 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
22510 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
22520 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
22530 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
22540 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22550 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
22560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
22570 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
22580 4e 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  NR);.      sqlit
22590 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
225a0 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e 52 65 67  , addrINR, inReg
225b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
225c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
225d0 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20    ** Form A:.   
225e0 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45   **   CASE x WHE
225f0 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
22600 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
22610 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
22620 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
22630 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42  **.    ** Form B
22640 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
22650 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
22660 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
22670 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
22680 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
22690 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
226a0 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72  m A is can be tr
226b0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74  ansformed into t
226c0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  he equivalent fo
226d0 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  rm B as follows:
226e0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
226f0 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31  HEN x=e1 THEN r1
22700 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20   WHEN x=e2 THEN 
22710 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20  r2 ....    **   
22720 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54       WHEN x=eN T
22730 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
22740 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
22750 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  X (if it exists)
22760 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
22770 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
22780 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65   in the last ele
22790 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78  ment of pExpr->x
227a0 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d  .pList if pExpr-
227b0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
227c0 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20  is.    ** odd.  
227d0 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
227e0 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20  tional.  If the 
227f0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
22800 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20  ts in x.pList.  
22810 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68    ** is even, th
22820 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20  en Y is omitted 
22830 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69  and the "otherwi
22840 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55  se" result is NU
22850 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
22860 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
22870 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
22880 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
22890 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
228a0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
228b0 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
228c0 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
228d0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
228e0 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
228f0 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
22900 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
22910 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
22920 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
22930 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
22940 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
22950 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
22960 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
22970 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
22980 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
229b0 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
229c0 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
229d0 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
229f0 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
22a00 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
22a10 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
22a20 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a40 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
22a50 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
22a60 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a80 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22a90 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
22aa0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ac0 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
22ad0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
22ae0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
22af0 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
22b00 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
22b10 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
22b20 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b40 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
22b50 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
22b60 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
22b90 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
22ba0 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30   Expr *pTest = 0
22bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22bc0 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
22bd0 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
22be0 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20  (form B) */.    
22bf0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
22c00 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50  iCacheLevel = pP
22c10 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
22c20 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65  l; )..      asse
22c30 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
22c40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
22c50 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
22c60 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
22c70 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
22c80 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
22c90 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
22ca0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
22cb0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
22cc0 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
22cd0 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
22ce0 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
22cf0 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
22d00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
22d10 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
22d20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
22d30 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
22d40 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a         tempX = *
22d50 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
22d60 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
22d70 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
22d80 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
22d90 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f  r(&tempX, exprCo
22da0 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
22db0 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
22dc0 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e1));.        te
22dd0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
22de0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
22df0 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65  emset(&opCompare
22e00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f  , 0, sizeof(opCo
22e10 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20  mpare));.       
22e20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
22e30 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
22e40 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
22e50 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20   &tempX;.       
22e60 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
22e70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  are;.        /* 
22e80 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39  Ticket b351d95f9
22e90 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31  cd5ef17e9d9dbae1
22ea0 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a  8f5ca8611190001:
22eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
22ec0 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65  value in regFree
22ed0 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70  1 might get SCop
22ee0 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69  y-ed into the fi
22ef0 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  le result..     
22f00 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75     ** So make su
22f10 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46  re that the regF
22f20 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73  ree1 register is
22f30 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20   not reused for 
22f40 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  other.        **
22f50 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f   purposes and po
22f60 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74  ssibly overwritt
22f70 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  en.  */.        
22f80 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
22f90 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
22fa0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20  i=0; i<nExpr-1; 
22fb0 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
22fc0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
22fd0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
22fe0 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
22ff0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23000 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20  ( pTest!=0 );.  
23010 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
23020 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74  e.pRight = aList
23030 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
23040 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23050 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
23060 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
23070 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
23080 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d        nextCase =
23090 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
230a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
230b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
230c0 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
230d0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
230e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
230f0 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
23100 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
23110 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
23120 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
23130 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
23140 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
23150 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
23160 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23170 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
23180 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
23190 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
231a0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65  te3VdbeGoto(v, e
231b0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
231c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
231d0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
231e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
231f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
23200 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
23210 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
23220 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
23230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23240 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
23250 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
23260 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23270 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
23280 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
23290 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
232a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
232b0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
232c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
232d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
232e0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
232f0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
23300 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
23310 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
23320 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
23330 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20  arse->nErr>0 .  
23340 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
23350 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
23360 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a  =iCacheLevel );.
23370 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23380 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
23390 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
233a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
233b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
233c0 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
233d0 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
233e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
233f0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
23400 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
23410 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
23420 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
23430 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
23440 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
23450 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
23460 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23470 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
23480 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
23490 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
234a0 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
234b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
234c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
234f0 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
23500 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
23510 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
23520 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
23530 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23540 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23550 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
23560 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
23570 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
23580 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23590 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
235a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
235b0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
235c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
235d0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
235e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
235f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
23600 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
23610 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
23620 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
23630 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
23640 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
23650 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
23660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23670 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
23680 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
23690 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
236a0 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
236d0 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
236e0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29  >u.zToken, 0, 0)
236f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
23700 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
23710 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
23720 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
23730 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
23740 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
23750 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
23760 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
23770 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
23780 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f  ../*.** Factor o
23790 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74  ut the code of t
237a0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
237b0 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ion to initializ
237c0 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a  ation time..**.*
237d0 2a 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20  * If regDest>=0 
237e0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
237f0 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  is always stored
23800 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
23810 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73  r and the.** res
23820 75 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61  ult is not reusa
23830 62 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74  ble.  If regDest
23840 3c 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  <0 then this rou
23850 74 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20  tine is free to 
23860 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61  .** store the va
23870 6c 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74  lue whereever it
23880 20 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67   wants.  The reg
23890 69 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20  ister where the 
238a0 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69  expression .** i
238b0 73 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75  s stored is retu
238c0 72 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44  rned.  When regD
238d0 65 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74  est<0, two ident
238e0 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  ical expressions
238f0 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f   will.** code to
23900 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
23910 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
23920 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
23930 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
23940 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
23950 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
23960 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
23970 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
23980 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
23990 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
239a0 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
239b0 44 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74  Dest       /* St
239c0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
239d0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
239e0 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
239f0 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f  *p;.  assert( Co
23a00 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
23a10 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  se) );.  p = pPa
23a20 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
23a30 0a 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30  .  if( regDest<0
23a40 20 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72   && p ){.    str
23a50 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23a60 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e  m *pItem;.    in
23a70 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  t i;.    for(pIt
23a80 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45  em=p->a, i=p->nE
23a90 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b  xpr; i>0; pItem+
23aa0 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  +, i--){.      i
23ab0 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62  f( pItem->reusab
23ac0 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  le && sqlite3Exp
23ad0 72 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d  rCompare(0,pItem
23ae0 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
23af0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23b00 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
23b10 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
23b20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23b30 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
23b40 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
23b50 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
23b60 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
23b70 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
23b80 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
23b90 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
23ba0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23bb0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
23bc0 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
23bd0 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
23be0 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c  sable = regDest<
23bf0 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44  0;.     if( regD
23c00 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20  est<0 ) regDest 
23c10 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
23c20 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
23c30 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
23c40 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70  regDest;.  }.  p
23c50 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
23c60 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  r = p;.  return 
23c70 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  regDest;.}../*.*
23c80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23c90 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
23ca0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
23cb0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
23cc0 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
23cd0 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
23ce0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
23cf0 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
23d00 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
23d10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
23d20 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
23d30 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
23d40 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
23d50 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
23d60 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
23d70 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
23d80 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
23d90 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
23da0 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
23db0 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
23dc0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
23dd0 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
23de0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
23df0 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
23e00 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
23e10 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
23e20 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
23e30 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
23e40 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
23e50 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
23e60 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
23e70 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
23e80 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
23e90 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
23ea0 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
23eb0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23ec0 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
23ed0 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
23ee0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
23ef0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
23f00 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
23f10 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
23f20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
23f30 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
23f40 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
23f50 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
23f60 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a  Expr).  ){.    *
23f70 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72  pReg  = 0;.    r
23f80 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
23f90 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
23fa0 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20  , pExpr, -1);.  
23fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
23fc0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
23fd0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
23fe0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
23ff0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24000 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
24010 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
24020 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
24030 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
24040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
24050 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24060 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
24070 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
24080 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
24090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
240a0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
240b0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
240c0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
240d0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
240e0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
240f0 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
24100 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
24110 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
24120 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
24130 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
24140 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
24150 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24160 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
24170 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
24180 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
24190 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
241a0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
241b0 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
241c0 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
241d0 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
241e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
241f0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
24200 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
24210 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
24220 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24230 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
24240 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24250 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24260 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
24270 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
24280 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
24290 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
242a0 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
242b0 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
242c0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
242d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
242e0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
242f0 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
24300 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
24310 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24320 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
24330 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
24340 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
24350 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
24360 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
24370 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
24380 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
24390 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
243a0 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
243b0 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
243c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
243d0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
243e0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
243f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24400 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
24410 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24420 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24430 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24440 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
24450 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
24460 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
24470 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
24480 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
24490 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
244a0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
244b0 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
244c0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
244d0 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
244e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
244f0 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
24500 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
24510 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
24520 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
24530 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
24540 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
24550 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
24560 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
24570 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
24580 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
24590 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
245a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
245b0 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
245c0 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
245d0 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
245e0 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
245f0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
24600 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
24610 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24620 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24630 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
24640 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
24650 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
24660 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
24670 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
24680 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
24690 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
246a0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
246b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
246c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
246d0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
246e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
246f0 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
24700 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
24710 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
24720 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
24730 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
24740 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
24750 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
24760 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
24770 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
24780 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
24790 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
247a0 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
247b0 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
247c0 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
247d0 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
247e0 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
247f0 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
24800 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
24810 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
24820 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
24830 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
24840 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
24850 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
24860 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
24870 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
24880 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
24890 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
248a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
248b0 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
248c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
248d0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
248e0 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
248f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
24900 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
24910 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
24920 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
24930 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
24940 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
24950 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24960 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
24970 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
24980 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
24990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
249a0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
249b0 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
249c0 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
249d0 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a  pr, iMem);.}../*
249e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
249f0 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
24a00 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
24a10 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
24a20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
24a30 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
24a40 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
24a50 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
24a60 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
24a70 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
24a80 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
24a90 76 61 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e  valuated.  The n
24aa0 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 77  umber returned w
24ab0 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62  ill.** usually b
24ac0 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62  e pList->nExpr b
24ad0 75 74 20 6d 69 67 68 74 20 62 65 20 72 65 64 75  ut might be redu
24ae0 63 65 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ced if SQLITE_EC
24af0 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73  EL_OMITREF.** is
24b00 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
24b10 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
24b20 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
24b30 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
24b40 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
24b50 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
24b60 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
24b70 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
24b80 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
24b90 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
24ba0 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
24bb0 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
24bc0 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
24bd0 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
24be0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
24bf0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  de..**.** The SQ
24c00 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c  LITE_ECEL_REF fl
24c10 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  ag means that ex
24c20 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
24c30 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78   list with.** Ex
24c40 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69  prList.a[].u.x.i
24c50 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76  OrderByCol>0 hav
24c60 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
24c70 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f  valuated and sto
24c80 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  red.** in regist
24c90 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61  ers at srcReg, a
24ca0 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20  nd so the value 
24cb0 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72  can be copied fr
24cc0 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20  om there..** If 
24cd0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
24ce0 52 45 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c  REF is also set,
24cf0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
24d00 20 77 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72   with u.x.iOrder
24d10 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73  ByCol>0.** are s
24d20 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61  imply omitted ra
24d30 74 68 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20  ther than being 
24d40 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52  copied from srcR
24d50 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  eg..*/.int sqlit
24d60 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
24d70 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
24d80 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
24d90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24da0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
24db0 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
24dc0 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
24dd0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
24de0 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
24df0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
24e00 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
24e10 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20  t srcReg,       
24e20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73   /* Source regis
24e30 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45  ters if SQLITE_E
24e40 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20  CEL_REF */.  u8 
24e50 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
24e60 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a  /* SQLITE_ECEL_*
24e70 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73   flags */.){.  s
24e80 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
24e90 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
24ea0 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20  t i, j, n;.  u8 
24eb0 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20  copyOp = (flags 
24ec0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  & SQLITE_ECEL_DU
24ed0 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f  P) ? OP_Copy : O
24ee0 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20  P_SCopy;.  Vdbe 
24ef0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
24f00 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  be;.  assert( pL
24f10 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
24f20 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
24f30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
24f40 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
24f50 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
24f60 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
24f70 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
24f80 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
24f90 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
24fa0 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
24fb0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
24fc0 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
24fd0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
24fe0 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
24ff0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
25000 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
25010 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  r;.    if( (flag
25020 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25030 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20  REF)!=0 && (j = 
25040 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
25050 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20  rByCol)>0 ){.   
25060 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
25070 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
25080 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d  EF ){.        i-
25090 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a  -;.        n--;.
250a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
250b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
250c0 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
250d0 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61  , j+srcReg-1, ta
250e0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d  rget+i);.      }
250f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
25100 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25110 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26  CEL_FACTOR)!=0 &
25120 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
25130 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
25140 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
25150 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
25160 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
25170 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  get+i);.    }els
25180 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
25190 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
251a0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
251b0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
251c0 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
251d0 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
251e0 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
251f0 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
25200 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
25210 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
25220 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
25230 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
25240 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
25250 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
25260 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
25270 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
25280 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
25290 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
252a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
252b0 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
252c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
252d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
252e0 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
252f0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
25300 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25310 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
25320 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
25330 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
25340 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
25350 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
25360 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
25370 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
25380 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
25390 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
253a0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
253b0 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
253c0 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
253d0 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
253e0 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
253f0 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
25400 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78  f x..**.** The x
25410 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72  JumpIf parameter
25420 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61   determines deta
25430 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55  ils:.**.**    NU
25440 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
25450 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20        Store the 
25460 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69  boolean result i
25470 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20  n reg[dest].**  
25480 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
25490 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74  rue:      Jump t
254a0 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a  o dest if true.*
254b0 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
254c0 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d  IfFalse:     Jum
254d0 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c  p to dest if fal
254e0 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d  se.**.** The jum
254f0 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65  pIfNull paramete
25500 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
25510 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e  xJumpIf is NULL.
25520 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25530 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
25540 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25550 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
25560 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
25570 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
25580 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
25590 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
255a0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
255b0 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
255c0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
255d0 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61  ination or stora
255e0 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20  ge location */. 
255f0 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50   void (*xJump)(P
25600 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c  arse*,Expr*,int,
25610 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20  int), /* Action 
25620 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74  to take */.  int
25630 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
25640 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
25650 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
25660 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78  s NULL */.){. Ex
25670 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
25680 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
25690 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
256a0 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
256b0 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
256c0 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
256d0 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
256e0 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
256f0 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
25700 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
25710 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
25720 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
25730 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
25740 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
25750 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
25760 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c  .  memset(&compL
25770 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  eft, 0, sizeof(E
25780 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
25790 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73  &compRight, 0, s
257a0 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
257b0 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c  memset(&exprAnd,
257c0 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
257d0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
257e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
257f0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
25800 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d  ct) );.  exprX =
25810 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
25820 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
25830 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64  K_AND;.  exprAnd
25840 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
25850 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52  ft;.  exprAnd.pR
25860 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
25870 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
25880 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
25890 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
258a0 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
258b0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
258c0 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
258d0 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  xpr;.  compRight
258e0 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63  .op = TK_LE;.  c
258f0 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
25900 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
25910 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
25920 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
25930 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72  1].pExpr;.  expr
25940 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72  ToRegister(&expr
25950 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  X, exprCodeVecto
25960 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  r(pParse, &exprX
25970 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
25980 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20   if( xJump ){.  
25990 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20    xJump(pParse, 
259a0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
259b0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
259c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72  else{.    /* Mar
259d0 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
259e0 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74   is being from t
259f0 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
25a00 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a  lause of a join.
25a10 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74      ** so that t
25a20 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
25a30 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69  deTarget() routi
25a40 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  ne will not atte
25a50 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20  mpt to move.    
25a60 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50  ** it into the P
25a70 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20  arse.pConstExpr 
25a80 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64  list.  We should
25a90 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66   use a new bit f
25aa0 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20  or this,.    ** 
25ab0 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74  for clarity, but
25ac0 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62   we are out of b
25ad0 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e  its in the Expr.
25ae0 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77  flags field so w
25af0 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f  e.    ** have to
25b00 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72   reuse the EP_Fr
25b10 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d  omJoin bit.  Bum
25b20 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72  mer. */.    expr
25b30 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72  X.flags |= EP_Fr
25b40 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69  omJoin;.    sqli
25b50 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
25b60 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  t(pParse, &exprA
25b70 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20  nd, dest);.  }. 
25b80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
25b90 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
25ba0 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
25bb0 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
25bc0 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
25bd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
25be0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
25bf0 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
25c00 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
25c10 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
25c20 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
25c30 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
25c40 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
25c50 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
25c60 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
25c70 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
25c80 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
25c90 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
25ca0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
25cb0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
25cc0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25cd0 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
25ce0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
25cf0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
25d00 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
25d10 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
25d20 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
25d30 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
25d40 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
25d50 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
25d60 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
25d70 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
25d80 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
25d90 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
25da0 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
25db0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
25dc0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
25dd0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
25de0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
25df0 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
25e00 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
25e10 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
25e20 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b  ase( xJump==0 );
25e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25e40 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
25e50 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
25e60 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
25e70 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
25e80 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
25e90 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
25ea0 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
25eb0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
25ec0 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
25ed0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
25ee0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
25ef0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
25f00 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
25f10 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
25f20 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
25f30 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
25f40 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
25f50 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
25f60 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
25f70 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
25f80 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
25f90 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
25fa0 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
25fb0 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
25fc0 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
25fd0 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
25fe0 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
25ff0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
26000 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
26010 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
26020 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
26030 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
26040 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
26050 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
26060 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
26070 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
26080 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
26090 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
260a0 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
260b0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
260c0 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
260d0 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
260e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
260f0 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
26100 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
26110 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
26120 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
26130 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
26140 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
26150 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
26160 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
26170 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
26180 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
26190 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
261a0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
261b0 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
261c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
261d0 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
261e0 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
261f0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
26200 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
26210 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
26220 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
26230 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
26240 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
26250 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
26260 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
26270 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
26280 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
26290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
262a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
262b0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
262c0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
262d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
262e0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
262f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
26300 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
26310 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
26320 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26330 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
26340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26350 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26360 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26370 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26380 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
26390 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
263a0 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
263b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
263c0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
263d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
263e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
263f0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
26400 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26420 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
26430 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
26440 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26450 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
26460 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
26470 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
26480 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
26490 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
264a0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
264b0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
264c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
264d0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
264e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
264f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
26500 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26510 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26520 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
26530 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
26540 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26550 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26560 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
26570 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
26580 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
26590 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
265a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
265b0 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
265c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
265d0 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
265e0 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
265f0 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
26600 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c  .      jumpIfNul
26610 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  l = SQLITE_NULLE
26620 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  Q;.      /* Fall
26630 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
26640 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
26650 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
26660 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
26670 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
26680 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
26690 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
266a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
266b0 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e  IsVector(pExpr->
266c0 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65  pLeft) ) goto de
266d0 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20  fault_expr;.    
266e0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
266f0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26700 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
26710 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
26720 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26730 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
26740 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
26750 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
26760 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
26770 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
26780 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
26790 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
267a0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
267b0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
267d0 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
267e0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
267f0 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
26800 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
26810 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
26820 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
26830 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
26840 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
26850 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26860 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
26870 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
26880 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
26890 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
268a0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
268b0 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
268c0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
268d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
268e0 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
268f0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
26900 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26910 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
26920 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26930 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
26940 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
26950 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
26960 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
26970 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
26980 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
26990 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
269a0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
269b0 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
269c0 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
269d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
269e0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
269f0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
26a00 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
26a10 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26a20 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
26a30 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
26a40 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
26a50 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26a60 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
26a70 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
26a80 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
26a90 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26aa0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
26ab0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
26ac0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
26ad0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26ae0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
26af0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
26b00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26b10 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
26b20 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
26b30 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
26b40 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
26b50 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
26b60 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
26b70 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
26b80 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
26b90 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
26ba0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26bb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
26bc0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
26bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26be0 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
26bf0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
26c00 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26c10 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
26c20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
26c30 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
26c40 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
26c50 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
26c60 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
26c70 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26c80 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
26c90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26ca0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26cb0 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
26cc0 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
26cd0 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65  pr, dest, sqlite
26ce0 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d  3ExprIfTrue, jum
26cf0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
26d00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
26d10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26d20 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
26d30 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
26d40 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
26d50 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
26d60 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
26d70 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
26d80 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f  l = jumpIfNull ?
26d90 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61   dest : destIfFa
26da0 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse;.      sqlit
26db0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
26dc0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
26dd0 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
26de0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
26df0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
26e00 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
26e10 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
26e20 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
26e30 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
26e40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
26e50 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
26e60 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a    default_expr:.
26e70 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
26e80 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
26e90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26ea0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
26eb0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
26ec0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
26ed0 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
26ee0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20         /* No-op 
26ef0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
26f00 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
26f10 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
26f20 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
26f30 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
26f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26f50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
26f60 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
26f70 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
26f80 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
26f90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
26fa0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
26fb0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
26fc0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
26fd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
26fe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26ff0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
27000 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
27010 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
27020 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
27030 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
27040 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
27050 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
27060 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
27070 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
27080 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
27090 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
270a0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
270b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
270c0 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
270d0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
270e0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
270f0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
27100 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
27110 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
27120 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
27130 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
27140 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
27150 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
27160 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
27170 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
27180 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
27190 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
271a0 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
271b0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
271c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
271d0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
271e0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
271f0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
27200 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
27210 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
27220 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
27230 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
27240 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
27250 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
27260 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
27270 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27280 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
27290 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
272a0 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
272b0 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
272c0 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
272d0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
272e0 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72   pExpr==0 )    r
272f0 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
27300 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
27310 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
27320 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
27330 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
27340 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
27350 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
27360 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
27370 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
27380 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
27390 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
273a0 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
273b0 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
273c0 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
273d0 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
273e0 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
273f0 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
27400 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
27410 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
27420 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
27430 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
27440 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
27450 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
27460 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
27470 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
27480 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
27490 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
274a0 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
274b0 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
274c0 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
274d0 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
274e0 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
274f0 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
27500 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
27510 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
27520 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
27530 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
27540 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
27550 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
27560 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
27570 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
27580 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
27590 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
275a0 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
275b0 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
275c0 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
275d0 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
275e0 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
275f0 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
27600 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
27610 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
27620 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
27630 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
27640 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
27650 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
27660 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27670 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
27680 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
27690 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
276a0 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
276b0 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
276c0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
276d0 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
276e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
276f0 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
27700 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
27710 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27720 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
27730 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
27740 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27750 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
27760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27770 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
27780 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
27790 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
277a0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
277b0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74  K_AND: {.      t
277c0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
277d0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
277e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
277f0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
27800 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
27810 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27820 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27830 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
27840 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27850 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
27860 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
27870 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27880 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27890 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
278a0 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
278b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
278c0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
278d0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
278e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
278f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27900 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27910 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27920 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
27930 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27940 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  , d2, jumpIfNull
27950 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
27960 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
27970 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
27980 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
27990 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
279a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
279b0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
279c0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
279d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
279e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
279f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27a00 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
27a10 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
27a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
27a30 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
27a40 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27a50 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27a60 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
27a70 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
27a80 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
27a90 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27aa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27ab0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
27ac0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
27ad0 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
27ae0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
27af0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
27b00 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
27b10 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
27b20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
27b30 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
27b40 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
27b50 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
27b60 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
27b70 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
27b80 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
27b90 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
27ba0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
27bb0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
27bc0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
27bd0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
27be0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
27bf0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
27c00 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
27c10 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
27c20 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
27c30 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27c40 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
27c50 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27c60 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27c70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
27c80 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
27c90 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
27ca0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27cb0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
27cc0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
27cd0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
27ce0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27cf0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
27d00 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
27d10 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
27d20 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
27d30 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
27d40 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
27d50 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27d60 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
27d70 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
27d80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27d90 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
27da0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
27db0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
27dc0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
27dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27de0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
27df0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
27e00 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27e10 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
27e20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
27e30 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
27e40 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
27e50 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27e60 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
27e70 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
27e80 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
27e90 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
27ea0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27eb0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
27ec0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
27ed0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
27ee0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27ef0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27f00 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
27f10 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
27f20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
27f30 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
27f40 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
27f50 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27f60 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
27f70 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
27f80 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
27f90 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27fa0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27fb0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
27fc0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
27fd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27fe0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
27ff0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28000 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
28010 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28020 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
28030 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
28040 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
28050 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
28060 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
28070 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
28080 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
28090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
280a0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
280b0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
280c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
280d0 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65  ISNULL );   Vdbe
280e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
280f0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
28100 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
28110 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20  ==TK_NOTNULL ); 
28120 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28130 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
28140 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
28150 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
28160 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28170 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28180 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
28190 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
281a0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
281b0 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
281c0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
281d0 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33  r, dest, sqlite3
281e0 45 78 70 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d  ExprIfFalse, jum
281f0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28200 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
28210 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28220 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
28230 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
28240 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c    if( jumpIfNull
28250 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28260 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
28270 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
28280 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
28290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
282a0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
282b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
282c0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
282d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
282e0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
282f0 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75  , dest, destIfNu
28300 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
28310 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28320 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
28330 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
28340 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28350 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
28360 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c  lt: {.    defaul
28370 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69  t_expr: .      i
28380 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
28390 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
283a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
283b0 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
283c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
283d0 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
283e0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
283f0 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
28400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28410 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
28420 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
28430 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
28440 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
28450 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
28460 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20  , OP_IfNot, r1, 
28470 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
28480 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
28490 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
284a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
284b0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
284c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
284d0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
284e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
284f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28500 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
28510 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
28520 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
28530 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
28540 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
28550 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
28560 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   Like sqlite3Exp
28570 72 49 66 46 61 6c 73 65 28 29 20 65 78 63 65 70  rIfFalse() excep
28580 74 20 74 68 61 74 20 61 20 63 6f 70 79 20 69 73  t that a copy is
28590 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20 62   made of pExpr b
285a0 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65  efore.** code ge
285b0 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68  neration, and th
285c0 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74  at copy is delet
285d0 65 64 20 61 66 74 65 72 20 63 6f 64 65 20 67 65  ed after code ge
285e0 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a  neration. This.*
285f0 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  * ensures that t
28600 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70  he original pExp
28610 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  r is unchanged..
28620 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
28630 78 70 72 49 66 46 61 6c 73 65 44 75 70 28 50 61  xprIfFalseDup(Pa
28640 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
28650 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
28660 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  st,int jumpIfNul
28670 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
28680 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
28690 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20    Expr *pCopy = 
286a0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
286b0 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
286c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
286d0 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  iled==0 ){.    s
286e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
286f0 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c  e(pParse, pCopy,
28700 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
28710 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
28720 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
28730 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pCopy);.}../*.**
28740 20 45 78 70 72 65 73 73 69 6f 6e 20 70 56 61 72   Expression pVar
28750 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
28760 6f 20 62 65 20 61 6e 20 53 51 4c 20 76 61 72 69  o be an SQL vari
28770 61 62 6c 65 2e 20 70 45 78 70 72 20 6d 61 79 20  able. pExpr may 
28780 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f  be any.** type o
28790 66 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  f expression..**
287a0 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
287b0 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c  a simple SQL val
287c0 75 65 20 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c  ue - an integer,
287d0 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62   real, string, b
287e0 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76  lob.** or NULL v
287f0 61 6c 75 65 20 2d 20 74 68 65 6e 20 74 68 65 20  alue - then the 
28800 56 44 42 45 20 63 75 72 72 65 6e 74 6c 79 20 62  VDBE currently b
28810 65 69 6e 67 20 70 72 65 70 61 72 65 64 20 69 73  eing prepared is
28820 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74   configured.** t
28830 6f 20 72 65 2d 70 72 65 70 61 72 65 20 65 61 63  o re-prepare eac
28840 68 20 74 69 6d 65 20 61 20 6e 65 77 20 76 61 6c  h time a new val
28850 75 65 20 69 73 20 62 6f 75 6e 64 20 74 6f 20 76  ue is bound to v
28860 61 72 69 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a  ariable pVar..**
28870 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  .** Additionally
28880 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  , if pExpr is a 
28890 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65  simple SQL value
288a0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69   and the value i
288b0 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  s the.** same as
288c0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
288d0 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c  bound to variabl
288e0 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f  e pVar, non-zero
288f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
28900 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
28910 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  he values are no
28920 74 20 74 68 65 20 73 61 6d 65 20 6f 72 20 69 66  t the same or if
28930 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20   pExpr is not a 
28940 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61  simple.** SQL va
28950 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20 72 65 74  lue, zero is ret
28960 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
28970 20 69 6e 74 20 65 78 70 72 43 6f 6d 70 61 72 65   int exprCompare
28980 56 61 72 69 61 62 6c 65 28 50 61 72 73 65 20 2a  Variable(Parse *
28990 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 56  pParse, Expr *pV
289a0 61 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  ar, Expr *pExpr)
289b0 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  {.  int res = 0;
289c0 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a 20 20 73  .  int iVar;.  s
289d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c  qlite3_value *pL
289e0 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20  , *pR = 0;.  .  
289f0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d  sqlite3ValueFrom
28a00 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
28a10 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55   pExpr, SQLITE_U
28a20 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  TF8, SQLITE_AFF_
28a30 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20 69 66  BLOB, &pR);.  if
28a40 28 20 70 52 20 29 7b 0a 20 20 20 20 69 56 61 72  ( pR ){.    iVar
28a50 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e   = pVar->iColumn
28a60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28a70 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
28a80 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
28a90 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c 69 74  ;.    pL = sqlit
28aa0 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
28ab0 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70  lue(pParse->pRep
28ac0 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 53 51  repare, iVar, SQ
28ad0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a  LITE_AFF_BLOB);.
28ae0 20 20 20 20 69 66 28 20 70 4c 20 29 7b 0a 20 20      if( pL ){.  
28af0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
28b00 76 61 6c 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d  value_type(pL)==
28b10 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
28b20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
28b30 61 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f  alue_text(pL); /
28b40 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
28b50 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54 46 2d  encoding is UTF-
28b60 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  8 */.      }.   
28b70 20 20 20 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c     res =  0==sql
28b80 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
28b90 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d  L, pR, 0);.    }
28ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
28bb0 65 46 72 65 65 28 70 52 29 3b 0a 20 20 20 20 73  eFree(pR);.    s
28bc0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
28bd0 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  pL);.  }..  retu
28be0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
28bf0 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
28c00 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
28c10 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
28c20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
28c30 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
28c40 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
28c50 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
28c60 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
28c70 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
28c80 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
28c90 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
28ca0 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
28cb0 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
28cc0 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
28cd0 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
28ce0 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
28cf0 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
28d00 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
28d10 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
28d20 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
28d30 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
28d40 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
28d50 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
28d60 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
28d70 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
28d80 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
28d90 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74  he pA side might
28da0 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47   be using TK_REG
28db0 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20  ISTER.  If that 
28dc0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
28dd0 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69  pB is.** not usi
28de0 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62  ng TK_REGISTER b
28df0 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
28e00 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e  equivalent, then
28e10 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e   still return 0.
28e20 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
28e30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
28e40 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
28e50 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
28e60 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
28e70 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
28e80 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
28e90 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
28ea0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
28eb0 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
28ec0 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
28ed0 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
28ee0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
28ef0 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
28f00 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
28f10 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
28f20 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
28f30 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
28f40 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
28f50 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
28f60 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
28f70 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
28f80 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
28f90 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
28fa0 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
28fb0 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
28fc0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
28fd0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
28fe0 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
28ff0 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
29000 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
29010 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
29020 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
29030 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
29040 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
29050 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
29060 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
29070 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  .**.** If pParse
29080 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
29090 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65  n TK_VARIABLE te
290a0 72 6d 73 20 69 6e 20 70 41 20 77 69 74 68 20 62  rms in pA with b
290b0 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50  indings in.** pP
290c0 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
290d0 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
290e0 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 73  against literals
290f0 20 69 6e 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a   in pB.  The .**
29100 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e   pParse->pVdbe->
29110 65 78 70 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20  expmask bitmask 
29120 69 73 20 75 70 64 61 74 65 64 20 66 6f 72 20 65  is updated for e
29130 61 63 68 20 76 61 72 69 61 62 6c 65 20 72 65 66  ach variable ref
29140 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70  erenced..** If p
29150 50 61 72 73 65 20 69 73 20 4e 55 4c 4c 20 28 74  Parse is NULL (t
29160 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20  he normal case) 
29170 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49  then any TK_VARI
29180 41 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a  ABLE term in .**
29190 20 41 72 67 75 6d 65 6e 74 20 70 50 61 72 73 65   Argument pParse
291a0 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
291b0 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20   be NULL. If it 
291c0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
291d0 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73  pA or.** pB caus
291e0 65 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75  es a return valu
291f0 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73  e of 2..*/.int s
29200 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29210 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
29220 20 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20   Expr *pA, Expr 
29230 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
29240 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c    u32 combinedFl
29250 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  ags;.  if( pA==0
29260 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20   || pB==0 ){.   
29270 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
29280 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66   0 : 2;.  }.  if
29290 28 20 70 50 61 72 73 65 20 26 26 20 70 41 2d 3e  ( pParse && pA->
292a0 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
292b0 26 26 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61  && exprCompareVa
292c0 72 69 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  riable(pParse, p
292d0 41 2c 20 70 42 29 20 29 7b 0a 20 20 20 20 72 65  A, pB) ){.    re
292e0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f  turn 0;.  }.  co
292f0 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41  mbinedFlags = pA
29300 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c  ->flags | pB->fl
29310 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69  ags;.  if( combi
29320 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e  nedFlags & EP_In
29330 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66  tValue ){.    if
29340 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d  ( (pA->flags&pB-
29350 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c  >flags&EP_IntVal
29360 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e  ue)!=0 && pA->u.
29370 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56  iValue==pB->u.iV
29380 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
29390 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
293a0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
293b0 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
293c0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ->op ){.    if( 
293d0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
293e0 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
293f0 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
29400 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69 54   pA->pLeft,pB,iT
29410 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
29420 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
29430 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54     if( pB->op==T
29440 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
29450 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
29460 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e 70  pParse, pA,pB->p
29470 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29 7b 0a  Left,iTab)<2 ){.
29480 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
29490 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
294a0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
294b0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
294c0 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47  && pA->op!=TK_AG
294d0 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  G_COLUMN && pA->
294e0 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
294f0 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46  if( pA->op==TK_F
29500 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20  UNCTION ){.     
29510 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
29520 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  Cmp(pA->u.zToken
29530 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
29540 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  0 ) return 2;.  
29550 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
29560 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
29570 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
29580 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29590 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
295a0 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20  ATE ? 1 : 2;.   
295b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41   }.  }.  if( (pA
295c0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
295d0 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
295e0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
295f0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
29600 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
29610 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54  inedFlags & EP_T
29620 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b  okenOnly)==0) ){
29630 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  .    if( combine
29640 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  dFlags & EP_xIsS
29650 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 32  elect ) return 2
29660 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
29670 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
29680 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20  rse, pA->pLeft, 
29690 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
296a0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
296b0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
296c0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
296d0 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
296e0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20  pRight, iTab) ) 
296f0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
29700 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
29710 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
29720 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
29730 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
29740 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57  n 2;.    if( ALW
29750 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
29760 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
29770 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f 70 21 3d  ==0) && pA->op!=
29780 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
29790 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
297a0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
297b0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
297c0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
297d0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
297e0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
297f0 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
29800 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
29810 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
29820 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
29830 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
29840 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
29850 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
29860 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
29870 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
29880 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
29890 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
298a0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
298b0 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
298c0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
298d0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
298e0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
298f0 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
29900 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
29910 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
29920 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
29930 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
29940 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
29950 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
29960 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
29970 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
29980 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
29990 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
299a0 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
299b0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
299c0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
299d0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
299e0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
299f0 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
29a00 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
29a10 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
29a20 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
29a30 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
29a40 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
29a50 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
29a60 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
29a70 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
29a80 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
29a90 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
29aa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
29ab0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
29ac0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
29ad0 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
29ae0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
29af0 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
29b00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
29b10 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
29b20 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
29b30 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
29b40 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
29b50 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
29b60 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
29b70 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
29b80 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
29b90 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
29ba0 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
29bb0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
29bc0 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
29bd0 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
29be0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
29bf0 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
29c00 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29c10 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
29c20 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
29c30 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
29c40 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29c50 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
29c60 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
29c70 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
29c80 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
29c90 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
29ca0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
29cb0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
29cc0 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
29cd0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
29ce0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
29cf0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
29d00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
29d10 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
29d20 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
29d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29d40 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
29d50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
29d60 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
29d70 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
29d80 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
29d90 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
29da0 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
29db0 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
29dc0 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
29dd0 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
29de0 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
29df0 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
29e00 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
29e10 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
29e20 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
29e30 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
29e40 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
29e50 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
29e60 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
29e70 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
29e80 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
29e90 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
29ea0 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
29eb0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
29ec0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
29ed0 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
29ee0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
29ef0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
29f00 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
29f10 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
29f20 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
29f30 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
29f40 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
29f50 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
29f60 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
29f70 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
29f80 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
29f90 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
29fa0 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
29fb0 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
29fc0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
29fd0 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
29fe0 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
29ff0 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
2a000 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
2a010 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
2a020 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
2a030 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2a040 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2a050 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e  e values of boun
2a060 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70  d variables in p
2a070 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61  E1 are .** compa
2a080 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65  red against lite
2a090 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45  ral values in pE
2a0a0 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56  2 and pParse->pV
2a0b0 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a  dbe->expmask is.
2a0c0 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  ** modified to r
2a0d0 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e  ecord which boun
2a0e0 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  d variables are 
2a0f0 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20  referenced.  If 
2a100 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55  pParse .** is NU
2a110 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77  LL, then false w
2a120 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2a130 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20  if pE1 contains 
2a140 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62  any bound variab
2a150 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  les..**.** When 
2a160 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
2a170 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
2a180 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
2a190 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
2a1a0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
2a1b0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
2a1c0 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
2a1d0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
2a1e0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
2a1f0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
2a200 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
2a210 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
2a220 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
2a230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a240 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72  rImpliesExpr(Par
2a250 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2a260 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
2a270 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2a280 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2a290 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
2a2a0 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
2a2b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2a2c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
2a2d0 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
2a2e0 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
2a2f0 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2a300 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74   pE1, pE2->pLeft
2a310 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
2a320 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
2a330 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2a340 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2a350 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2a360 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2a370 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2a380 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
2a390 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2a3a0 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
2a3b0 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
2a3c0 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
2a3d0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2a3e0 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
2a3f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2a400 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
2a410 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2a420 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2a430 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66  e, pX, pE2->pLef
2a440 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65  t, iTab)==0 ) re
2a450 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2a460 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2a470 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2a480 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2a490 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
2a4a0 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
2a4b0 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  er.** to determi
2a4c0 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73 73  ne if an express
2a4d0 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75  ion can be evalu
2a4e0 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ated by referenc
2a4f0 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65  e to the.** inde
2a500 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20  x only, without 
2a510 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73  having to do a s
2a520 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f  earch for the co
2a530 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
2a540 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65  able entry.  The
2a550 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66   IdxCover.pIdx f
2a560 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65  ield is the inde
2a570 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75  x.  IdxCover.iCu
2a580 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73  r.** is the curs
2a590 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
2a5a0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43  ..*/.struct IdxC
2a5b0 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a  over {.  Index *
2a5c0 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65  pIdx;     /* The
2a5d0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73   index to be tes
2a5e0 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  ted for coverage
2a5f0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
2a600 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2a610 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2a620 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
2a630 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
2a640 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   */.};../*.** Ch
2a650 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2a660 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e 63  ere are referenc
2a670 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2a680 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b   table .** pWalk
2a690 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2a6a0 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61 74  >iCur can be sat
2a6b0 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68 65  isfied using the
2a6c0 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65   index.** pWalke
2a6d0 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2a6e0 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2a6f0 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65 72  int exprIdxCover
2a700 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2a710 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2a720 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
2a730 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
2a740 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2a750 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2a760 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26  over->iCur.   &&
2a770 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
2a780 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75  Index(pWalker->u
2a790 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
2a7a0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
2a7b0 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61  )<0.  ){.    pWa
2a7c0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
2a7d0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2a7e0 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Abort;.  }.  ret
2a7f0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2a800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
2a810 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78  mine if an index
2a820 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77   pIdx on table w
2a830 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 20  ith cursor iCur 
2a840 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a  contains will.**
2a850 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2a860 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74  pExpr.  Return t
2a870 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65 78  rue if the index
2a880 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a   does cover the.
2a890 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
2a8a0 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70  d false if the p
2a8b0 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
2a8c0 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65  references table
2a8d0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74   columns.** that
2a8e0 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69   are not found i
2a8f0 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  n the index pIdx
2a900 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78  ..**.** An index
2a910 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70   covering an exp
2a920 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68  ression means th
2a930 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
2a940 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c  n can be.** eval
2a950 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79  uated using only
2a960 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77   the index and w
2a970 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
2a980 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63   lookup the.** c
2a990 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
2a9a0 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74  le entry..*/.int
2a9b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65   sqlite3ExprCove
2a9c0 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78  redByIndex(.  Ex
2a9d0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
2a9e0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2a9f0 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20  o be tested */. 
2aa00 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
2aa10 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
2aa20 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
2aa30 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2aa40 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78  table */.  Index
2aa50 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
2aa60 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74  * The index that
2aa70 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 66   might be used f
2aa80 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29  or coverage */.)
2aa90 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2aaa0 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
2aab0 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26  xcov;.  memset(&
2aac0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
2aad0 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20  ;.  xcov.iCur = 
2aae0 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64  iCur;.  xcov.pId
2aaf0 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45  x = pIdx;.  w.xE
2ab00 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
2ab10 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e  prIdxCover;.  w.
2ab20 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78  u.pIdxCover = &x
2ab30 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  cov;.  sqlite3Wa
2ab40 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2ab50 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65  );.  return !w.e
2ab60 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Code;.}.../*.** 
2ab70 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
2ab80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2ab90 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
2aba0 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
2abb0 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65  r.** to count re
2abc0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
2abd0 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
2abe0 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e   arguments of an
2abf0 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66   .** aggregate f
2ac00 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65  unction, in orde
2ac10 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  r to implement t
2ac20 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  he.** sqlite3Fun
2ac30 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72  ctionThisSrc() r
2ac40 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
2ac50 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53  t SrcCount {.  S
2ac60 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2ac70 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61  /* One particula
2ac80 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  r FROM clause in
2ac90 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20   a nested query 
2aca0 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20  */.  int nThis; 
2acb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2acc0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2acd0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63   columns in pSrc
2ace0 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  List */.  int nO
2acf0 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ther;      /* Nu
2ad00 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2ad10 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2ad20 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
2ad30 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
2ad40 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
2ad50 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2ad60 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  to columns..*/.s
2ad70 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72  tatic int exprSr
2ad80 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70  cCount(Walker *p
2ad90 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2ada0 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e  xpr){.  /* The N
2adb0 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65  EVER() on the se
2adc0 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63  cond term is bec
2add0 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63  ause sqlite3Func
2ade0 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2adf0 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  ).  ** is always
2ae00 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73   called before s
2ae10 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2ae20 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e  eAggregates() an
2ae30 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b  d so the.  ** TK
2ae40 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f  _COLUMNs have no
2ae50 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65  t yet been conve
2ae60 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47  rted into TK_AGG
2ae70 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a  _COLUMN.  If.  *
2ae80 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
2ae90 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69  nUsesThisSrc() i
2aea0 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74  s used different
2aeb0 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  ly in the future
2aec0 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52  , the.  ** NEVER
2aed0 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  () will need to 
2aee0 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20  be removed. */. 
2aef0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
2af00 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56  TK_COLUMN || NEV
2af10 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ER(pExpr->op==TK
2af20 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a  _AGG_COLUMN) ){.
2af30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2af40 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a  truct SrcCount *
2af50 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
2af60 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72  SrcCount;.    Sr
2af70 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
2af80 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  >pSrc;.    int n
2af90 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72  Src = pSrc ? pSr
2afa0 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20  c->nSrc : 0;.   
2afb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63   for(i=0; i<nSrc
2afc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2afd0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
2afe0 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  =pSrc->a[i].iCur
2aff0 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
2b000 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72   }.    if( i<nSr
2b010 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54  c ){.      p->nT
2b020 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  his++;.    }else
2b030 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65  {.      p->nOthe
2b040 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  r++;.    }.  }. 
2b050 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2b060 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  inue;.}../*.** D
2b070 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20  etermine if any 
2b080 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  of the arguments
2b090 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75   to the pExpr Fu
2b0a0 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  nction reference
2b0b0 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52  .** pSrcList.  R
2b0c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2b0d0 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74  ey do.  Also ret
2b0e0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
2b0f0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
2b100 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20  no arguments or 
2b110 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e  has only constan
2b120 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
2b130 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45  turn false if pE
2b140 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  xpr.** reference
2b150 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f  s columns but no
2b160 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62  t columns of tab
2b170 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72  les found in pSr
2b180 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cList..*/.int sq
2b190 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
2b1a0 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70  sThisSrc(Expr *p
2b1b0 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70  Expr, SrcList *p
2b1c0 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b  SrcList){.  Walk
2b1d0 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53  er w;.  struct S
2b1e0 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61  rcCount cnt;.  a
2b1f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2b200 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
2b210 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  N );.  w.xExprCa
2b220 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63  llback = exprSrc
2b230 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  Count;.  w.xSele
2b240 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ctCallback = 0;.
2b250 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20    w.u.pSrcCount 
2b260 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53  = &cnt;.  cnt.pS
2b270 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20  rc = pSrcList;. 
2b280 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a   cnt.nThis = 0;.
2b290 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30    cnt.nOther = 0
2b2a0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2b2b0 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70  xprList(&w, pExp
2b2c0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72  r->x.pList);.  r
2b2d0 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e  eturn cnt.nThis>
2b2e0 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d  0 || cnt.nOther=
2b2f0 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  =0;.}../*.** Add
2b300 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
2b310 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
2b320 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52  aCol[] array.  R
2b330 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
2b340 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
2b350 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
2b360 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
2b370 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2b380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b390 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
2b3a0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
2b3b0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
2b3c0 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
2b3d0 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41  >aCol = sqlite3A
2b3e0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
2b3f0 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
2b400 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
2b410 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
2b420 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
2b430 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
2b440 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  mn,.       &i.  
2b450 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
2b460 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
2b470 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
2b480 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
2b490 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
2b4a0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
2b4b0 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
2b4c0 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
2b4d0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
2b4e0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2b4f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b500 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
2b510 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
2b520 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
2b530 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
2b540 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
2b550 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
2b560 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
2b570 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
2b580 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
2b590 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
2b5a0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
2b5b0 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  nc,.       &i.  
2b5c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
2b5d0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
2b5e0 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
2b5f0 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
2b600 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
2b610 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
2b620 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
2b630 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2b640 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
2b650 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2b660 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
2b670 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
2b680 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2b690 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
2b6a0 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
2b6b0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
2b6c0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
2b6d0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
2b6e0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
2b6f0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
2b700 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
2b710 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2b720 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
2b730 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
2b740 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
2b750 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
2b760 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
2b770 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
2b780 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
2b790 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
2b7a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b7b0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2b7c0 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
2b7d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b7e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2b7f0 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
2b800 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2b810 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
2b820 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
2b830 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
2b840 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
2b850 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
2b860 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
2b870 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
2b880 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
2b890 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2b8a0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
2b8b0 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
2b8c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
2b8d0 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
2b8e0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2b8f0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2b900 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
2b910 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2b920 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2b930 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
2b940 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2b950 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
2b960 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2b970 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
2b980 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
2b990 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
2b9a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
2b9b0 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
2b9c0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
2b9d0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2b9e0 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
2b9f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
2ba00 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2ba10 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
2ba20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
2ba30 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
2ba40 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
2ba50 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
2ba60 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
2ba70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
2ba80 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
2ba90 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
2baa0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2bab0 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
2bac0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
2bad0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
2bae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2baf0 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
2bb00 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
2bb10 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
2bb20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2bb30 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
2bb40 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2bb60 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
2bb70 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
2bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2bb90 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2bba0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2bbb0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2bbc0 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
2bbd0 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
2bbe0 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
2bbf0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
2bc00 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2bc10 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
2bc20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2bc30 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
2bc40 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
2bc50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2bc60 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
2bc70 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
2bc80 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
2bc90 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
2bca0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
2bcb0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
2bcc0 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
2bcd0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
2bce0 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
2bcf0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2bd10 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2bd20 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2bd30 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
2bd40 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
2bd50 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
2bd60 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
2bd70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2bd80 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
2bd90 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2bda0 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
2bdb0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2bde0 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
2bdf0 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
2be00 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
2be10 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2be20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2be30 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
2be40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2be50 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
2be60 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
2be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be80 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
2be90 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
2bea0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
2beb0 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
2bed0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
2bee0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
2bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2bf00 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2bf10 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
2bf20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2bf30 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2bf40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bf50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bf60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bf70 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2bf80 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
2bf90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bfa0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2bfb0 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
2bfc0 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
2bfd0 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
2bfe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bff0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c000 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
2c010 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
2c020 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
2c030 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
2c040 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
2c050 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
2c060 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
2c070 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
2c080 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
2c090 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
2c0a0 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
2c0b0 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
2c0c0 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
2c0d0 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
2c0e0 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
2c0f0 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
2c100 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c110 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
2c120 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2c130 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2c140 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2c150 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2c160 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
2c170 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
2c180 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
2c190 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2c1a0 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
2c1b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2c1c0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
2c1d0 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
2c1e0 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
2c1f0 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
2c200 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
2c210 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
2c220 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2c230 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2c240 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
2c250 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
2c260 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
2c270 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
2c280 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
2c290 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
2c2a0 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
2c2b0 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
2c2c0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2c2d0 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
2c2e0 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
2c2f0 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
2c300 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
2c310 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
2c320 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2c330 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
2c340 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
2c350 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2c360 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
2c370 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
2c380 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
2c390 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2c3a0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
2c3b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
2c3c0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2c3d0 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65 6d  Compare(0, pItem
2c3e0 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20  ->pExpr, pExpr, 
2c3f0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
2c400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c420 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
2c430 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
2c440 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
2c450 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
2c460 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
2c470 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
2c480 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
2c490 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c4a0 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
2c4b0 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
2c4c0 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
2c4d0 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
2c4e0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
2c4f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2c500 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2c510 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2c520 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2c530 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2c540 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2c550 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
2c560 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
2c570 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2c580 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
2c590 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2c5a0 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
2c5b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
2c5c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2c5d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2c5e0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
2c5f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2c600 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
2c610 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
2c620 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c640 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
2c650 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  en, .           
2c660 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
2c670 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
2c680 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
2c690 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
2c6a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
2c6b0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
2c6c0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2c6d0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2c6e0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
2c6f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2c700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
2c720 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
2c730 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
2c740 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2c750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c760 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
2c770 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
2c780 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
2c790 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
2c7a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c7b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2c7c0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2c7d0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2c7e0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2c7f0 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2c800 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2c810 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2c820 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
2c830 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20  g = (i16)i;.    
2c840 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
2c850 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
2c860 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2c870 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
2c880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2c890 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2c8a0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
2c8b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2c8c0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
2c8d0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
2c8e0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2c8f0 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
2c900 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
2c910 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
2c920 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
2c930 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77  t);.  pWalker->w
2c940 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20  alkerDepth++;.  
2c950 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2c960 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  nue;.}.static vo
2c970 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  id analyzeAggreg
2c980 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 28  atesInSelectEnd(
2c990 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2c9a0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2c9b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2c9c0 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
2c9d0 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65    pWalker->walke
2c9e0 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a  rDepth--;.}../*.
2c9f0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70  ** Analyze the p
2ca00 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
2ca10 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
2ca20 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2ca30 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
2ca40 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
2ca50 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67  o be added to Ag
2ca60 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  gInfo object tha
2ca70 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a  t pNC->pAggInfo.
2ca80 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ** points to.  A
2ca90 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
2caa0 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68  s are made on th
2cab0 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  e AggInfo object
2cac0 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   as.** necessary
2cad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2cae0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
2caf0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
2cb00 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2cb10 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
2cb20 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
2cb30 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
2cb40 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
2cb50 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2cb60 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
2cb70 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
2cb80 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
2cb90 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
2cba0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
2cbb0 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
2cbc0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2cbd0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2cbe0 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78  sInSelect;.  w.x
2cbf0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2cc00 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2cc10 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a  tesInSelectEnd;.
2cc20 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20    w.walkerDepth 
2cc30 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  = 0;.  w.u.pNC =
2cc40 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
2cc50 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
2cc60 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
2cc70 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
2cc80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
2cc90 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2cca0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
2ccb0 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
2ccc0 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
2ccd0 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
2cce0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
2ccf0 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
2cd00 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
2cd10 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
2cd20 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
2cd30 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
2cd40 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2cd50 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
2cd60 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
2cd70 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
2cd80 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2cd90 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
2cda0 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
2cdb0 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
2cdc0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
2cdd0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
2cde0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2cdf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2ce00 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
2ce10 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
2ce20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2ce30 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2ce40 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
2ce50 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
2ce60 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
2ce70 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
2ce80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
2ce90 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2cea0 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
2ceb0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
2cec0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2ced0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2cee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
2cef0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
2cf00 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2cf10 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
2cf20 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
2cf30 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
2cf40 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
2cf50 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
2cf60 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  purpose..**.** I
2cf70 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
2cf80 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
2cf90 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75  used by the colu
2cfa0 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a  mn cache, then.*
2cfb0 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69  * the deallocati
2cfc0 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75  on is deferred u
2cfd0 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ntil the column 
2cfe0 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20  cache line that 
2cff0 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  uses.** the regi
2d000 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61  ster becomes sta
2d010 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
2d020 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2d030 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
2d040 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
2d050 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
2d060 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
2d070 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
2d080 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e  mpReg) ){.    in
2d090 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
2d0a0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
2d0b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
2d0c0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
2d0d0 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
2d0e0 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
2d0f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65        if( p->iRe
2d100 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
2d110 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
2d120 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2d130 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
2d140 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
2d150 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
2d160 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
2d170 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2d180 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
2d190 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
2d1a0 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
2d1b0 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a  e registers..*/.
2d1c0 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
2d1d0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
2d1e0 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
2d1f0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
2d200 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65  if( nReg==1 ) re
2d210 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54  turn sqlite3GetT
2d220 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2d230 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52    i = pParse->iR
2d240 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70  angeReg;.  n = p
2d250 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2d260 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20  ;.  if( nReg<=n 
2d270 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
2d280 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
2d290 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e  e(pParse, i, i+n
2d2a0 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73  -1) );.    pPars
2d2b0 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20  e->iRangeReg += 
2d2c0 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
2d2d0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e  ->nRangeReg -= n
2d2e0 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
2d2f0 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d    i = pParse->nM
2d300 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
2d310 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
2d320 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
2d330 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
2d340 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50  leaseTempRange(P
2d350 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2d360 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
2d370 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31  ){.  if( nReg==1
2d380 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
2d390 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
2d3a0 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20  arse, iReg);.   
2d3b0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
2d3c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
2d3d0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
2d3e0 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
2d3f0 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
2d400 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
2d410 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2d420 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
2d430 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
2d440 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
2d450 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
2d460 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
2d470 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
2d480 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
2d490 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d4a0 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2d4b0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
2d4c0 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
2d4d0 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
2d4e0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2d4f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69  0;.}../*.** Vali
2d500 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d  date that no tem
2d510 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
2d520 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  falls within the
2d530 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69   range of.** iFi
2d540 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c  rst..iLast, incl
2d550 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75  usive.  This rou
2d560 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
2d570 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73  l from within as
2d580 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
2d590 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ents..*/.#ifdef 
2d5a0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
2d5b0 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49   sqlite3NoTempsI
2d5c0 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  nRange(Parse *pP
2d5d0 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74  arse, int iFirst
2d5e0 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20  , int iLast){.  
2d5f0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61  int i;.  if( pPa
2d600 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30  rse->nRangeReg>0
2d610 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2d620 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d  RangeReg+pParse-
2d630 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46 69  >nRangeReg > iFi
2d640 72 73 74 0a 20 20 20 26 26 20 70 50 61 72 73 65  rst.   && pParse
2d650 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20 69  ->iRangeReg <= i
2d660 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72  Last.  ){.     r
2d670 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
2d680 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
2d690 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29  ->nTempReg; i++)
2d6a0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
2d6b0 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69  ->aTempReg[i]>=i
2d6c0 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65 2d  First && pParse-
2d6d0 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c  >aTempReg[i]<=iL
2d6e0 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
2d6f0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
2d700 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
2d710 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d720 44 45 42 55 47 20 2a 2f 0a                       DEBUG */.