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

Artifact 68552ca7f1238c9661e60a3adb4bd28c93d5373895bed5a0293b3977518dc980:


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: 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33  zToken ? sqlite3
66a0: 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29  Strlen30(zToken)
66b0: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73   : 0;.  return s
66c0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
66d0: 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a  db, op, &x, 0);.
66e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
66f0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
6700: 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65  nd pRight to the
6710: 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74   Expr node pRoot
6720: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74  ..**.** If pRoot
6730: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
6740: 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20  s that a memory 
6750: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
6760: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a   has occurred..*
6770: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
6780: 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72  delete the subtr
6790: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
67a0: 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ight..*/.void sq
67b0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
67c0: 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74  ubtrees(.  sqlit
67d0: 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a  e3 *db,.  Expr *
67e0: 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70  pRoot,.  Expr *p
67f0: 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52  Left,.  Expr *pR
6800: 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52  ight.){.  if( pR
6810: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  oot==0 ){.    as
6820: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
6830: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
6840: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6850: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
6860: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6870: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
6880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6890: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
68a0: 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20  pRoot->pRight = 
68b0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52  pRight;.      pR
68c0: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
68d0: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69  _Propagate & pRi
68e0: 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  ght->flags;.    
68f0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  }.    if( pLeft 
6900: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
6910: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
6920: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
6930: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
6940: 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  e & pLeft->flags
6950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72  ;.    }.    expr
6960: 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29  SetHeight(pRoot)
6970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
6980: 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20  llocate an Expr 
6990: 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73  node which joins
69a0: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20   as many as two 
69b0: 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20  subtrees..**.** 
69c0: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  One or both of t
69d0: 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20  he subtrees can 
69e0: 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  be NULL.  Return
69f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6a00: 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f  e new.** Expr no
6a10: 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f  de.  Or, if an O
6a20: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
6a30: 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d   set pParse->db-
6a40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a  >mallocFailed,.*
6a50: 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72  * free the subtr
6a60: 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ees and return N
6a70: 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ULL..*/.Expr *sq
6a80: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
6a90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6aa0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
6ab0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
6ac0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6ad0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6ae0: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6af0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
6b00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
6b10: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
6b20: 72 20 2a 70 52 69 67 68 74 20 20 20 20 20 20 20  r *pRight       
6b30: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
6b40: 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78  erand */.){.  Ex
6b50: 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d  pr *p;.  if( op=
6b60: 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73  =TK_AND && pPars
6b70: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
6b80: 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74    /* Take advant
6b90: 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72  age of short-cir
6ba0: 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d  cuit false optim
6bb0: 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20  ization for AND 
6bc0: 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  */.    p = sqlit
6bd0: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
6be0: 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69  ->db, pLeft, pRi
6bf0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
6c00: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
6c10: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72  MallocRawNN(pPar
6c20: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45  se->db, sizeof(E
6c30: 78 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70  xpr));.    if( p
6c40: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
6c50: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  (p, 0, sizeof(Ex
6c60: 70 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  pr));.      p->o
6c70: 70 20 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d  p = op & TKFLG_M
6c80: 41 53 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41  ASK;.      p->iA
6c90: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  gg = -1;.    }. 
6ca0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6cb0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6cc0: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6cd0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
6ce0: 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20    if( p ) {.    
6cf0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6d00: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6d10: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  ->nHeight);.  }.
6d20: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6d30: 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74  *.** Add pSelect
6d40: 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70   to the Expr.x.p
6d50: 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f  Select field.  O
6d60: 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  r, if pExpr is N
6d70: 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61  ULL (due.** do a
6d80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6d90: 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e  on failure) then
6da0: 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c   delete the pSel
6db0: 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
6dc0: 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72  oid sqlite3PExpr
6dd0: 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20  AddSelect(Parse 
6de0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
6df0: 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  Expr, Select *pS
6e00: 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45  elect){.  if( pE
6e10: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
6e20: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  ->x.pSelect = pS
6e30: 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53  elect;.    ExprS
6e40: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
6e50: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45  , EP_xIsSelect|E
6e60: 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20  P_Subquery);.   
6e70: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
6e80: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50  eightAndFlags(pP
6e90: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
6ea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6eb0: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
6ec0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6ed0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
6ee0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6ef0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  b, pSelect);.  }
6f00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6f10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6f20: 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52  always either TR
6f30: 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73  UE or FALSE (res
6f40: 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74  pectively),.** t
6f50: 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49  hen return 1.  I
6f60: 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74  f one cannot det
6f70: 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68  ermine the truth
6f80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
6f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63   expression at c
6fa0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75  ompile-time retu
6fb0: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rn 0..**.** This
6fc0: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
6fd0: 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74  ion.  If is OK t
6fe0: 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  o return 0 here 
6ff0: 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65  even if.** the e
7000: 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79  xpression really
7010: 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65   is always false
7020: 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c   or false (a fal
7030: 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a  se negative)..**
7040: 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67   But it is a bug
7050: 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20   to return 1 if 
7060: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
7070: 69 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72  ight have differ
7080: 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ent.** boolean v
7090: 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65  alues in differe
70a0: 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  nt circumstances
70b0: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
70c0: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
70d0: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
70e0: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
70f0: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
7100: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
7110: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
7120: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
7130: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
7140: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
7150: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
7160: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
7170: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
7180: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72  int exprAlwaysTr
7190: 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ue(Expr *p){.  i
71a0: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  nt v = 0;.  if( 
71b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
71c0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
71d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
71e0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
71f0: 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29  Integer(p, &v) )
7200: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
7210: 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74  urn v!=0;.}.stat
7220: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
7230: 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b  sFalse(Expr *p){
7240: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7250: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7260: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7270: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7280: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7290: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
72a0: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
72b0: 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a   return v==0;.}.
72c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
72d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
72e0: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
72f0: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
7300: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
7310: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
7320: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
7330: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
7340: 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  * If one side or
7350: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
7360: 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74  e AND is known t
7370: 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e  o be false, then
7380: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72   instead.** of r
7390: 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20  eturning an AND 
73a0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74  expression, just
73b0: 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61   return a consta
73c0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  nt expression wi
73d0: 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66  th.** a value of
73e0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20   false..*/.Expr 
73f0: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28  *sqlite3ExprAnd(
7400: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7410: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
7420: 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  pRight){.  if( p
7430: 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Left==0 ){.    r
7440: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
7450: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
7460: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7470: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
7480: 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
7490: 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65  alse(pLeft) || e
74a0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
74b0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
74c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
74d0: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
74e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
74f0: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
7500: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
7510: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7520: 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
7530: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c  te3IntTokens[0],
7540: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
7550: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
7560: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7570: 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30  db, TK_AND, 0, 0
7580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
7590: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
75a0: 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74  (db, pNew, pLeft
75b0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  , pRight);.    r
75c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a  eturn pNew;.  }.
75d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
75e0: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
75f0: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
7600: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
7610: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
7620: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
7630: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
7640: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7650: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
7660: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
7670: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
7680: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7690: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
76a0: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
76b0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
76c0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
76d0: 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e  FUNCTION, pToken
76e0: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 1);.  if( pNew
76f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7700: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
7710: 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20  (db, pList); /* 
7720: 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61  Avoid memory lea
7730: 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  k when malloc fa
7740: 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ils */.    retur
7750: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  n 0;.  }.  pNew-
7760: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7770: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7780: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7790: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
77a0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
77b0: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
77c0: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
77d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
77e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
77f0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7800: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7810: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7820: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7830: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7840: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7850: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7860: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7870: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7880: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7890: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
78a0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
78b0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
78c0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
78d0: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
78e0: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
78f0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7900: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7910: 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64  too big to avoid
7920: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
7930: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
7940: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
7950: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
7960: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
7970: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
7980: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
7990: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
79a0: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
79b0: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
79c0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
79d0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
79e0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
79f0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
7a00: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
7a10: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
7a20: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
7a30: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7a40: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
7a50: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
7a60: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7a70: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
7a80: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
7a90: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7aa0: 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c  r, u32 n){.  sql
7ab0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7ac0: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
7ad0: 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20  har *z;.  ynVar 
7ae0: 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  x;..  if( pExpr=
7af0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
7b00: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
7b10: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7b20: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
7b30: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7b40: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7b50: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7b60: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7b70: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7b80: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
7b90: 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74  ==(u32)sqlite3St
7ba0: 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69  rlen30(z) );.  i
7bb0: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[1]==0 ){.  
7bc0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
7bd0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
7be0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
7bf0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7c00: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
7c10: 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20  [0]=='?' );.    
7c20: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
7c30: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d  arse->nVar);.  }
7c40: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f  else{.    int do
7c50: 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Add = 0;.    if(
7c60: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
7c70: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7c80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7c90: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
7ca0: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
7cb0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
7cc0: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
7cd0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
7ce0: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
7cf0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20    int bOk;.     
7d00: 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f   if( n==2 ){ /*O
7d10: 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54  PTIMIZATION-IF-T
7d20: 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20  RUE*/.        i 
7d30: 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20  = z[1]-'0';  /* 
7d40: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
7d50: 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67  of ?N for a sing
7d60: 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20  le digit N */.  
7d70: 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
7d80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7d90: 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c      bOk = 0==sql
7da0: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
7db0: 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54  , &i, n-1, SQLIT
7dc0: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
7dd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7de0: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   i==0 );.      t
7df0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
7e00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7e10: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
7e20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7e30: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29  ABLE_NUMBER]-1 )
7e40: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7e50: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
7e60: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7e70: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
7e80: 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  .      if( bOk==
7e90: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
7ea0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7eb0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7ec0: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
7ed0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7ee0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
7ef0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
7f00: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
7f10: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
7f20: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
7f30: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7f40: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
7f50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
7f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d       }.      x =
7f70: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
7f80: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
7f90: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
7fa0: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
7fb0: 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f  nt)x;.        do
7fc0: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
7fd0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
7fe0: 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
7ff0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78  Parse->pVList, x
8000: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8010: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
8020: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8030: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
8040: 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24   like ":aaa", "$
8050: 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20  aaa" or "@aaa". 
8060: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
8070: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
8080: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
8090: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
80a0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
80b0: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
80c0: 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  e.      ** has n
80d0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
80e0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
80f0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
8100: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mber.      */.  
8110: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73      x = (ynVar)s
8120: 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54  qlite3VListNameT
8130: 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c  oNum(pParse->pVL
8140: 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ist, z, n);.    
8150: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
8160: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8170: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8180: 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  );.        doAdd
8190: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
81a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64    }.    if( doAd
81b0: 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  d ){.      pPars
81c0: 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69  e->pVList = sqli
81d0: 74 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20  te3VListAdd(db, 
81e0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
81f0: 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a  z, n, x);.    }.
8200: 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f    }.  pExpr->iCo
8210: 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20  lumn = x;.  if( 
8220: 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  x>db->aLimit[SQL
8230: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8240: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8250: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8260: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8270: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8280: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8290: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
82a0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
82b0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
82c0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
82d0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
82e0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
82f0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
8300: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
8310: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
8320: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8330: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8340: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8350: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8360: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8370: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8380: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8390: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
83a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
83b0: 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48  EBUG.  if( ExprH
83c0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
83d0: 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48  _Leaf) && !ExprH
83e0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
83f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
8400: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
8410: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eft==0 );.    as
8420: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8430: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8440: 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  ( p->x.pSelect==
8450: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
8460: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8470: 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f  operty(p, (EP_To
8480: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
8490: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
84a0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
84b0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
84c0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
84d0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
84e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
84f0: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
8500: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
8510: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70  f( p->pLeft && p
8520: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op!=TK_SELECT_
8530: 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33  COLUMN ) sqlite3
8540: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8550: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
8560: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
8570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8580: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8590: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
85a0: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
85b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
85c0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
85d0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
85e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
85f0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
8600: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8610: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8620: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8630: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8640: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8650: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
8660: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
8670: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
8680: 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  n);.  if( !ExprH
8690: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
86a0: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
86b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
86c0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
86d0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
86e0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
86f0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
8700: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
8710: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
8720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8730: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8740: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
8750: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
8760: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
8770: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8780: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8790: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
87a0: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
87b0: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
87c0: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
87d0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
87e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
87f0: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8800: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
8810: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8820: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
8830: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
8840: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
8850: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8860: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
8870: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
8880: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
8890: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
88a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
88b0: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
88c0: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
88d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
88e0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
88f0: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
8900: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
8910: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
8920: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
8930: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
8940: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
8950: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
8960: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
8970: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
8980: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
8990: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
89a0: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
89b0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
89c0: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
89d0: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
89e0: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
89f0: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
8a00: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
8a10: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
8a20: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a70: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8a80: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8a90: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
8aa0: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
8ab0: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
8ac0: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
8ad0: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
8ae0: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
8af0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
8b00: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
8b10: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
8b20: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
8b30: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
8b40: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
8b50: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
8b60: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
8b70: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
8b80: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
8b90: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
8ba0: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
8bb0: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
8bc0: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
8bd0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
8be0: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
8bf0: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
8c00: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
8c10: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
8c20: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
8c30: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
8c40: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
8c50: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
8c60: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
8c70: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
8c80: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
8c90: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
8ca0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
8cb0: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
8cc0: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
8cd0: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
8ce0: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
8cf0: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
8d00: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
8d10: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
8d20: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
8d30: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
8d40: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
8d50: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
8d60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
8d70: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
8d80: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
8d90: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
8da0: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
8db0: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
8dc0: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
8dd0: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
8de0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
8df0: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
8e00: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
8e10: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
8e20: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
8e30: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
8e40: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
8e50: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
8e60: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
8e70: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
8e80: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8e90: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
8ea0: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
8eb0: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
8ec0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8ed0: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
8ee0: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
8ef0: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
8f00: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
8f10: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
8f20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
8f30: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8f40: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
8f50: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
8f60: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
8f70: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
8f80: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
8f90: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
8fa0: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
8fb0: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
8fc0: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
8fd0: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
8fe0: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
8ff0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9000: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
9010: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20  if( 0==flags || 
9020: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
9030: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e  _COLUMN ){.    n
9040: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
9050: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
9060: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9070: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9080: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
9090: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
90a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
90b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
90c0: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
90d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
90e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
90f0: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
9100: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9110: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
9120: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9130: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9140: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
9150: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9160: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
9170: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
9180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9190: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
91a0: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
91b0: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
91c0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
91d0: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
91e0: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
91f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9200: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
9210: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
9220: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9230: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9240: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9250: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
9260: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
9270: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
9280: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
9290: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
92a0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
92b0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
92c0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
92d0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
92e0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
92f0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
9300: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
9310: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9320: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9330: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9340: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
9350: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9360: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
9370: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
9380: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
9390: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
93a0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
93b0: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
93c0: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
93d0: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
93e0: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
93f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
9400: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
9410: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
9420: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
9430: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
9440: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
9450: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
9460: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
9470: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9480: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
9490: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
94a0: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
94b0: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
94c0: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
94d0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
94e0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
94f0: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
9500: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
9510: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
9520: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
9530: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
9540: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
9550: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
9560: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
9570: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
9580: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
9590: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
95a0: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
95b0: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
95c0: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
95d0: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
95e0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
95f0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
9600: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
9610: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
9620: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
9630: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
9640: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
9650: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
9660: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
9670: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
9680: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
9690: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
96a0: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
96b0: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
96c0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
96d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
96e0: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  te;.}../*.** Thi
96f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
9700: 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
9710: 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70  ExprDup(), excep
9720: 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66  t that if pzBuff
9730: 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55  er .** is not NU
9740: 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65  LL then *pzBuffe
9750: 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
9760: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
9770: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a  r large enough .
9780: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
9790: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
97a0: 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73  on p, the copies
97b0: 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a   of p->u.zToken.
97c0: 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ** (if applicabl
97d0: 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69  e), and the copi
97e0: 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65  es of the p->pLe
97f0: 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74  ft and p->pRight
9800: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
9810: 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20   if any. Before 
9820: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75  returning, *pzBu
9830: 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74  ffer is set to t
9840: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
9850: 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f  st the.** portio
9860: 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  n of the buffer 
9870: 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74  copied into by t
9880: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
9890: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78  .static Expr *ex
98a0: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
98b0: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
98c0: 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70  dupFlags, u8 **p
98d0: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
98e0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
98f0: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
9900: 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41  turn */.  u8 *zA
9910: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
9920: 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
9930: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75  from which to bu
9940: 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ild Expr object 
9950: 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63 46  */.  u32 staticF
9960: 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50  lag;       /* EP
9970: 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63 65  _Static if space
9980: 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72   not obtained fr
9990: 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20  om malloc */..  
99a0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
99b0: 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
99c0: 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c 61    assert( dupFla
99d0: 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  gs==0 || dupFlag
99e0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
99f0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9a00: 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75  zBuffer==0 || du
9a10: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
9a20: 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20  REDUCE );..  /* 
9a30: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
9a40: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
9a50: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
9a60: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66  . */.  if( pzBuf
9a70: 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f  fer ){.    zAllo
9a80: 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20  c = *pzBuffer;. 
9a90: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9aa0: 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c  EP_Static;.  }el
9ab0: 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  se{.    zAlloc =
9ac0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9ad0: 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45  RawNN(db, dupedE
9ae0: 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  xprSize(p, dupFl
9af0: 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69  ags));.    stati
9b00: 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  cFlag = 0;.  }. 
9b10: 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29   pNew = (Expr *)
9b20: 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70  zAlloc;..  if( p
9b30: 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  New ){.    /* Se
9b40: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
9b50: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
9b60: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
9b70: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
9b80: 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68    ** by pNew. Th
9b90: 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50  is is either EXP
9ba0: 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52  R_FULLSIZE, EXPR
9bb0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a  _REDUCEDSIZE or.
9bc0: 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45      ** EXPR_TOKE
9bd0: 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65  NONLYSIZE. nToke
9be0: 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
9bf0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9c00: 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20  consumed.    ** 
9c10: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
9c20: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
9c30: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
9c40: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
9c50: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
9c60: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
9c70: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64  rStructSize(p, d
9c80: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f  upFlags);.    co
9c90: 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  nst int nNewSize
9ca0: 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26   = nStructSize &
9cb0: 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20   0xfff;.    int 
9cc0: 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20  nToken;.    if( 
9cd0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9ce0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
9cf0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
9d00: 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  ){.      nToken 
9d10: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9d20: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
9d30: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
9d40: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b       nToken = 0;
9d50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
9d60: 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  upFlags ){.     
9d70: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
9d80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
9d90: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
9da0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
9db0: 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b  c, p, nNewSize);
9dc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9dd0: 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75    u32 nSize = (u
9de0: 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a  32)exprStructSiz
9df0: 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  e(p);.      memc
9e00: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53  py(zAlloc, p, nS
9e10: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
9e20: 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53  nSize<EXPR_FULLS
9e30: 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20  IZE ){ .        
9e40: 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e  memset(&zAlloc[n
9e50: 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46  Size], 0, EXPR_F
9e60: 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a  ULLSIZE-nSize);.
9e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9e80: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
9e90: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
9ea0: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
9eb0: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
9ec0: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
9ed0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
9ee0: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
9ef0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
9f00: 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e  atic|EP_MemToken
9f10: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
9f20: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
9f30: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
9f40: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
9f50: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
9f60: 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20  = staticFlag;.. 
9f70: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
9f80: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
9f90: 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  g, if any. */.  
9fa0: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
9fb0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
9fc0: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
9fd0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
9fe0: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
9ff0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f        memcpy(zTo
a000: 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken, p->u.zToken
a010: 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  , nToken);.    }
a020: 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70  ..    if( 0==((p
a030: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
a040: 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e  ags) & (EP_Token
a050: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29  Only|EP_Leaf)) )
a060: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  {.      /* Fill 
a070: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
a080: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
a090: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
a0a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
a0b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a0c0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
a0d0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a0e0: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
a0f0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
a100: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75  p->x.pSelect, du
a110: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  pFlags);.      }
a120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
a130: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
a140: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a150: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
a160: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a170: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
a180: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
a190: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
a1a0: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69  pRight. */.    i
a1b0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a1c0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
a1d0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a1e0: 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  ) ){.      zAllo
a1f0: 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  c += dupedExprNo
a200: 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  deSize(p, dupFla
a210: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gs);.      if( !
a220: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a230: 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  pNew, EP_TokenOn
a240: 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20  ly|EP_Leaf) ){. 
a250: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
a260: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a  ft = p->pLeft ?.
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a290: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
a2a0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a2b0: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a2c0: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a2d0: 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20   p->pRight ?.   
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
a300: 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44  p->pRight, EXPRD
a310: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a320: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  oc) : 0;.      }
a330: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66  .      if( pzBuf
a340: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  fer ){.        *
a350: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
a360: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
a370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
a380: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a390: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
a3a0: 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20  |EP_Leaf) ){.   
a3b0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a3c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a3d0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a3e0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a3f0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a400: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43     assert( p->iC
a410: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70  olumn==0 || p->p
a420: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
a430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a440: 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70  >pRight==0  || p
a450: 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65  ->pRight==p->pLe
a460: 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ft );.        }e
a470: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
a480: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
a490: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a4a0: 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  p->pLeft, 0);.  
a4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a4c0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
a4d0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a4e0: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  , p->pRight, 0);
a4f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
a510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
a520: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
a530: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
a540: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
a550: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
a560: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
a570: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
a580: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
a590: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
a5a0: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
a5b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
a5c0: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
a5d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
a5e0: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
a5f0: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
a600: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
a610: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
a620: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
a630: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
a640: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
a650: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
a660: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
a670: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
a680: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
a690: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
a6a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a6b0: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
a6c0: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
a6d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
a6e0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
a6f0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
a700: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
a710: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
a720: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
a730: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
a740: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
a750: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
a760: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
a770: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
a780: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
a790: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
a7a0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
a7b0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a7c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a7d0: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
a7e0: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
a7f0: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
a800: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
a810: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
a820: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
a830: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
a840: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
a850: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
a860: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
a870: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
a880: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
a890: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
a8a0: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
a8b0: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
a8c0: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
a8d0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
a8e0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
a8f0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
a900: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a910: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
a920: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
a930: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a940: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
a950: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
a960: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
a970: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
a980: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
a990: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
a9a0: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
a9b0: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
a9c0: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
a9d0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
a9e0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
a9f0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
aa00: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
aa10: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
aa20: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
aa30: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
aa40: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
aa50: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
aa60: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
aa70: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
aa80: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
aa90: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
aaa0: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
aab0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
aac0: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
aad0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
aae0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
aaf0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
ab00: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
ab10: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
ab20: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
ab30: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
ab40: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
ab50: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
ab60: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
ab70: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
ab80: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
ab90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
aba0: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
abb0: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
abc0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
abd0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
abe0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
abf0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
ac00: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
ac10: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
ac20: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
ac30: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
ac40: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
ac50: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
ac60: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
ac70: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
ac80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ac90: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
aca0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
acb0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73   .             s
acc0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 2b 73 69 7a  izeof(*pNew)+siz
acd0: 65 6f 66 28 70 4e 65 77 2d 3e 61 5b 30 5d 29 2a  eof(pNew->a[0])*
ace0: 28 70 2d 3e 6e 45 78 70 72 2d 31 29 20 29 3b 0a  (p->nExpr-1) );.
acf0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
ad00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
ad10: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4e 65 77 2d  ->nAlloc = pNew-
ad20: 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70  >nExpr = p->nExp
ad30: 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65  r;.  pItem = pNe
ad40: 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d  w->a;.  pOldItem
ad50: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
ad60: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
ad70: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
ad80: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
ad90: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
ada0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
adb0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
adc0: 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  xpr;.    pItem->
add0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
ade0: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45  xprDup(db, pOldE
adf0: 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  xpr, flags);.   
ae00: 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20   if( pOldExpr . 
ae10: 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d      && pOldExpr-
ae20: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
ae30: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70  OLUMN.     && (p
ae40: 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d  NewExpr = pItem-
ae50: 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20  >pExpr)!=0 .    
ae60: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
ae70: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
ae80: 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a  mn==0 || i>0 );.
ae90: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78        if( pNewEx
aea0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29  pr->iColumn==0 )
aeb0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
aec0: 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66  ( pOldExpr->pLef
aed0: 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69  t==pOldExpr->pRi
aee0: 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ght );.        p
aef0: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d  PriorSelectCol =
af00: 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74   pNewExpr->pLeft
af10: 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69   = pNewExpr->pRi
af20: 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ght;.      }else
af30: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
af40: 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( i>0 );.       
af50: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d   assert( pItem[-
af60: 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  1].pExpr!=0 );. 
af70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
af80: 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  NewExpr->iColumn
af90: 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ==pItem[-1].pExp
afa0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a  r->iColumn+1 );.
afb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
afc0: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d  pPriorSelectCol=
afd0: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
afe0: 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ->pLeft );.     
aff0: 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65     pNewExpr->pLe
b000: 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63  ft = pPriorSelec
b010: 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tCol;.      }.  
b020: 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a    }.    pItem->z
b030: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
b040: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
b050: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
b060: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
b070: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b080: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53  db, pOldItem->zS
b090: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
b0a0: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
b0b0: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
b0c0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
b0d0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d  e = 0;.    pItem
b0e0: 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70  ->bSpanIsTab = p
b0f0: 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73  OldItem->bSpanIs
b100: 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Tab;.    pItem->
b110: 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b  u = pOldItem->u;
b120: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
b130: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ew;.}../*.** If 
b140: 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72  cursors, trigger
b150: 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  s, views and sub
b160: 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20  queries are all 
b170: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  omitted from.** 
b180: 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  the build, then 
b190: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  none of the foll
b1a0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20  owing routines, 
b1b0: 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73  except for .** s
b1c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b1d0: 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ), can be called
b1e0: 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  . sqlite3SelectD
b1f0: 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65  up() is sometime
b200: 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  s.** called with
b210: 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74   a NULL argument
b220: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
b230: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
b240: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
b250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
b260: 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69  GER) \. || !defi
b270: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b280: 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73  SUBQUERY).SrcLis
b290: 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
b2a0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b2b0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e  , SrcList *p, in
b2c0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c  t flags){.  SrcL
b2d0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
b2e0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   i;.  int nByte;
b2f0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
b300: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
b310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
b320: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
b330: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
b340: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
b350: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
b360: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
b370: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b380: 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
b390: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b3a0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b3b0: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
b3c0: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
b3d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b3e0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
b3f0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
b400: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
b410: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
b420: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
b430: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
b440: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61  &p->a[i];.    Ta
b450: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
b460: 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  NewItem->pSchema
b470: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63   = pOldItem->pSc
b480: 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74  hema;.    pNewIt
b490: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
b4a0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b4b0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  db, pOldItem->zD
b4c0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
b4d0: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
b4e0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b4f0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
b500: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
b510: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
b520: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b530: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61   pOldItem->zAlia
b540: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
b550: 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ->fg = pOldItem-
b560: 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  >fg;.    pNewIte
b570: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
b580: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
b590: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64      pNewItem->ad
b5a0: 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64  drFillSub = pOld
b5b0: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
b5c0: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
b5d0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c  >regReturn = pOl
b5e0: 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  dItem->regReturn
b5f0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74  ;.    if( pNewIt
b600: 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
b610: 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  By ){.      pNew
b620: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
b630: 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53  dBy = sqlite3DbS
b640: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b650: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
b660: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  y);.    }.    pN
b670: 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78  ewItem->pIBIndex
b680: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42   = pOldItem->pIB
b690: 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
b6a0: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  NewItem->fg.isTa
b6b0: 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  bFunc ){.      p
b6c0: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  NewItem->u1.pFun
b6d0: 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20  cArg = .        
b6e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b6f0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
b700: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20  m->u1.pFuncArg, 
b710: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
b720: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
b730: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
b740: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
b750: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
b760: 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b  pTab->nTabRef++;
b770: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
b780: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
b790: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b7a0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
b7b0: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
b7c0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
b7d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b7e0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b7f0: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
b800: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
b810: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
b820: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
b830: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
b840: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
b850: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
b860: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
b870: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
b880: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
b890: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b8a0: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
b8b0: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
b8c0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
b8d0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
b8e0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b8f0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b900: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b910: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
b920: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
b930: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b940: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
b950: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
b960: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b970: 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  awNN(db, p->nId*
b980: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
b990: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
b9a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b9b0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
b9c0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
b9d0: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
b9e0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
b9f0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
ba00: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
ba10: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
ba20: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
ba30: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
ba40: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
ba50: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
ba60: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
ba70: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
ba80: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
ba90: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
baa0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
bab0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
bac0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
bad0: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
bae0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
baf0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
bb00: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
bb10: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
bb20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
bb30: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bb40: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
bb50: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
bb60: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
bb70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
bb80: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
bb90: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
bba0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
bbb0: 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67   *pDup, int flag
bbc0: 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52  s){.  Select *pR
bbd0: 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74  et = 0;.  Select
bbe0: 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53   *pNext = 0;.  S
bbf0: 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52  elect **pp = &pR
bc00: 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  et;.  Select *p;
bc10: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
bc20: 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75  0 );.  for(p=pDu
bc30: 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f  p; p; p=p->pPrio
bc40: 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
bc50: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
bc60: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
bc70: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
bc80: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
bc90: 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d  break;.    pNew-
bca0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
bcb0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
bcc0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
bcd0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53  s);.    pNew->pS
bce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
bcf0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
bd00: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rc, flags);.    
bd10: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
bd20: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bd30: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61  , p->pWhere, fla
bd40: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
bd50: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
bd60: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
bd70: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
bd80: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
bd90: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
bda0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
bdb0: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
bdc0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  .    pNew->pOrde
bdd0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
bde0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
bdf0: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
be00: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
be10: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77   p->op;.    pNew
be20: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b  ->pNext = pNext;
be30: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  .    pNew->pPrio
be40: 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  r = 0;.    pNew-
be50: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
be60: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
be70: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
be80: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65      pNew->pOffse
be90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
bea0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
beb0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
bec0: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  New->iLimit = 0;
bed0: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
bee0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  et = 0;.    pNew
bef0: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  ->selFlags = p->
bf00: 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55  selFlags & ~SF_U
bf10: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
bf20: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
bf30: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
bf40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
bf50: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
bf60: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
bf70: 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow = p->nSelectR
bf80: 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  ow;.    pNew->pW
bf90: 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62  ith = withDup(db
bfa0: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20  , p->pWith);.   
bfb0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
bfc0: 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a  tName(pNew, p->z
bfd0: 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 2a 70  SelName);.    *p
bfe0: 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 70  p = pNew;.    pp
bff0: 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f 72   = &pNew->pPrior
c000: 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 4e  ;.    pNext = pN
c010: 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ew;.  }..  retur
c020: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
c030: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
c040: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
c050: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
c060: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
c070: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
c080: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
c090: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
c0a0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
c0b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
c0c0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
c0d0: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
c0e0: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
c0f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
c100: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
c110: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  t..**.** If a me
c120: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
c130: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
c140: 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73  e entire list is
c150: 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55   freed and.** NU
c160: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
c170: 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20   If non-NULL is 
c180: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69  returned, then i
c190: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  t is guaranteed.
c1a0: 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
c1b0: 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73  entry was succes
c1c0: 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e  sfully appended.
c1d0: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
c1e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
c1f0: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
c200: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
c210: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c220: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c230: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
c240: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
c250: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
c260: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
c270: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
c280: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
c290: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
c2a0: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
c2b0: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  L */.){.  struct
c2c0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c2d0: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
c2e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c2f0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
c300: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
c310: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
c320: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
c330: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c340: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
c350: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
c360: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
c370: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
c380: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
c390: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
c3a0: 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 65 6c  Alloc = 1;.  }el
c3b0: 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  se if( pList->nE
c3c0: 78 70 72 3d 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr==pList->nAll
c3d0: 6f 63 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  oc ){.    ExprLi
c3e0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e  st *pNew;.    pN
c3f0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
c400: 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c  alloc(db, pList,
c410: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73   .             s
c420: 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32  izeof(*pList)+(2
c430: 2a 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2d  *pList->nAlloc -
c440: 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74   1)*sizeof(pList
c450: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
c460: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
c470: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
c480: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
c490: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73  = pNew;.    pLis
c4a0: 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a  t->nAlloc *= 2;.
c4b0: 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
c4c0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
c4d0: 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72  Expr++];.  asser
c4e0: 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75  t( offsetof(stru
c4f0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
c500: 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28  ,zName)==sizeof(
c510: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b  pItem->pExpr) );
c520: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
c530: 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c  tof(struct ExprL
c540: 69 73 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d  ist_item,pExpr)=
c550: 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =0 );.  memset(&
c560: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73  pItem->zName,0,s
c570: 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66  izeof(*pItem)-of
c580: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
c590: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d  prList_item,zNam
c5a0: 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45  e));.  pItem->pE
c5b0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72  xpr = pExpr;.  r
c5c0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
c5d0: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
c5e0: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
c5f0: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
c600: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
c610: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
c620: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
c630: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c640: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
c650: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
c660: 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20  ./*.** pColumns 
c670: 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61  and pExpr form a
c680: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
c690: 6e 74 20 77 68 69 63 68 20 69 73 20 70 61 72 74  nt which is part
c6a0: 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63   of the SET.** c
c6b0: 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41  lause of an UPDA
c6c0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c  TE statement.  L
c6d0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
c6e0: 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d         (a,b,c) =
c6f0: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
c700: 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28  pr3).** Or:    (
c710: 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54  a,b,c) = (SELECT
c720: 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e   x,y,z FROM ....
c730: 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ).**.** For each
c740: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63   term of the vec
c750: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20  tor assignment, 
c760: 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69  append new entri
c770: 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70  es to the.** exp
c780: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69  ression list pLi
c790: 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65  st.  In the case
c7a0: 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 6f   of a subquery o
c7b0: 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e  n the RHS, appen
c7c0: 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43  d.** TK_SELECT_C
c7d0: 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
c7e0: 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  s..*/.ExprList *
c7f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c800: 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50  ppendVector(.  P
c810: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c820: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
c830: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
c840: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
c850: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
c860: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
c870: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c880: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c  /.  IdList *pCol
c890: 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69  umns,      /* Li
c8a0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c  st of names of L
c8b0: 48 53 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e  HS of the assign
c8c0: 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ment */.  Expr *
c8d0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
c8e0: 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65   /* Vector expre
c8f0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
c900: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
c910: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
c920: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c930: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  ->db;.  int n;. 
c940: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46   int i;.  int iF
c950: 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70  irst = pList ? p
c960: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
c970: 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63  .  /* pColumns c
c980: 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20  an only be NULL 
c990: 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75  due to an OOM bu
c9a0: 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  t an OOM will ca
c9b0: 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74  use an.  ** exit
c9c0: 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
c9d0: 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76  outine being inv
c9e0: 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45  oked */.  if( NE
c9f0: 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29  VER(pColumns==0)
ca00: 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61   ) goto vector_a
ca10: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69  ppend_error;.  i
ca20: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f  f( pExpr==0 ) go
ca30: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
ca40: 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66  _error;..  /* If
ca50: 20 74 68 65 20 52 48 53 20 69 73 20 61 20 76 65   the RHS is a ve
ca60: 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61  ctor, then we ca
ca70: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68  n immediately ch
ca80: 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
ca90: 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f  .  ** the size o
caa0: 66 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48  f the RHS and LH
cab0: 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66  S match.  But if
cac0: 20 74 68 65 20 52 48 53 20 69 73 20 61 20 53 45   the RHS is a SE
cad0: 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64  LECT, .  ** wild
cae0: 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74  cards ("*") in t
caf0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
cb00: 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74   the SELECT must
cb10: 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
cb20: 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20  ore.  ** we can 
cb30: 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68 65 63  do the size chec
cb40: 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68 65 20  k, so defer the 
cb50: 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c  size check until
cb60: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
cb70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
cb80: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43  pr->op!=TK_SELEC
cb90: 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  T && pColumns->n
cba0: 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78  Id!=(n=sqlite3Ex
cbb0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
cbc0: 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  pr)) ){.    sqli
cbd0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cbe0: 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20  se, "%d columns 
cbf0: 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75  assigned %d valu
cc00: 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  es",.           
cc10: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e           pColumn
cc20: 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20  s->nId, n);.    
cc30: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
cc40: 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  nd_error;.  }.. 
cc50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
cc60: 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  umns->nId; i++){
cc70: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75 62 45  .    Expr *pSubE
cc80: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
cc90: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28  rForVectorField(
cca0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69  pParse, pExpr, i
ccb0: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
ccc0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
ccd0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  pend(pParse, pLi
cce0: 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20  st, pSubExpr);. 
ccf0: 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
cd00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
cd10: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72  ist->nExpr==iFir
cd20: 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20  st+i+1 );.      
cd30: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
cd40: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
cd50: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
cd60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f  zName;.      pCo
cd70: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
cd80: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
cd90: 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ..  if( !db->mal
cda0: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70 45 78  locFailed && pEx
cdb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
cdc0: 54 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73  T && ALWAYS(pLis
cdd0: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70  t!=0) ){.    Exp
cde0: 72 20 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73  r *pFirst = pLis
cdf0: 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78  t->a[iFirst].pEx
ce00: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
ce10: 70 46 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20  pFirst!=0 );.   
ce20: 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74 2d   assert( pFirst-
ce30: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
ce40: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20  OLUMN );.     . 
ce50: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
ce60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ce70: 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74   in pRight so it
ce80: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
ce90: 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c   when.    ** sql
cea0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
ceb0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a  te() is called *
cec0: 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52  /.    pFirst->pR
ced0: 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  ight = pExpr;.  
cee0: 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20    pExpr = 0;..  
cef0: 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68    /* Remember th
cf00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48  e size of the LH
cf10: 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74  S in iTable so t
cf20: 68 61 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b  hat we can check
cf30: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
cf40: 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a   RHS and LHS siz
cf50: 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20  es match during 
cf60: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
cf70: 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e   */.    pFirst->
cf80: 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e  iTable = pColumn
cf90: 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63  s->nId;.  }..vec
cfa0: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
cfb0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  :.  sqlite3ExprD
cfc0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
cfd0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
cfe0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
cff0: 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  umns);.  return 
d000: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
d010: 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64  Set the sort ord
d020: 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  er for the last 
d030: 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67  element on the g
d040: 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a  iven ExprList..*
d050: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
d060: 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64  prListSetSortOrd
d070: 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  er(ExprList *p, 
d080: 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b  int iSortOrder){
d090: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
d0a0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
d0b0: 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49  SQLITE_SO_UNDEFI
d0c0: 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f  NED<0 && SQLITE_
d0d0: 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c  SO_ASC>=0 && SQL
d0e0: 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b  ITE_SO_DESC>0 );
d0f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45  .  assert( p->nE
d100: 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69  xpr>0 );.  if( i
d110: 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20  SortOrder<0 ){. 
d120: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b     assert( p->a[
d130: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
d140: 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f  Order==SQLITE_SO
d150: 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75  _ASC );.    retu
d160: 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70  rn;.  }.  p->a[p
d170: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
d180: 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74  rder = (u8)iSort
d190: 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Order;.}../*.** 
d1a0: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
d1b0: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
d1c0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
d1d0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
d1e0: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
d1f0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
d200: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
d210: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
d220: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
d230: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
d240: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
d250: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
d260: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
d270: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
d280: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d290: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
d2a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
d2b0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
d2c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
d2e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d2f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d300: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
d310: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
d320: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
d330: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
d340: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
d350: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
d360: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
d370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
d380: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
d390: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
d3a0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
d3b0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
d3c0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
d3d0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
d3e0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
d3f0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d400: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
d410: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
d420: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
d430: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
d440: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
d450: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
d460: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
d470: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
d480: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
d490: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
d4a0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
d4b0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
d4c0: 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33  equote ) sqlite3
d4d0: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
d4e0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
d4f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
d500: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
d510: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
d520: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
d530: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
d540: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d550: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
d560: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
d570: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
d580: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
d590: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
d5a0: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
d5b0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d5c0: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
d5d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d5e0: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
d5f0: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
d600: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
d610: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
d620: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d630: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d640: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d650: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
d660: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d670: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
d680: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
d690: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
d6a0: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
d6b0: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
d6c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d6d0: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
d6e0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
d6f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
d700: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
d710: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
d720: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
d730: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
d740: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
d750: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d760: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
d770: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
d780: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
d790: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
d7a0: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
d7b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d7c0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
d7d0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
d7e0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
d7f0: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
d800: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
d840: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
d850: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
d860: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
d870: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
d880: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
d890: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
d8a0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
d8b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
d8c0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
d8d0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
d8e0: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
d8f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d900: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d910: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
d920: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
d930: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
d940: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
d950: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
d960: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
d970: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
d980: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
d990: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
d9a0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
d9b0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
d9c0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
d9d0: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
d9e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d9f0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
da00: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
da10: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
da20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
da30: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
da40: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
da50: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
da60: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72  INLINE void expr
da70: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c  ListDeleteNN(sql
da80: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
da90: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
daa0: 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  t i = pList->nEx
dab0: 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  pr;.  struct Exp
dac0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
dad0: 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20  m =  pList->a;. 
dae0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
daf0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b  nExpr>0 );.  do{
db00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
db10: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
db20: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
db30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
db40: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
db50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
db60: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
db70: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b  n);.    pItem++;
db80: 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30  .  }while( --i>0
db90: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   );.  sqlite3DbF
dba0: 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  reeNN(db, pList)
dbb0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
dbc0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(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 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72  if( pList ) expr
dc00: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ListDeleteNN(db,
dc10: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
dc20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
dc30: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
dc40: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
dc50: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
dc60: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
dc70: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
dc80: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
dc90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
dca0: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
dcb0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
dcc0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
dcd0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
dce0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78   i++){.       Ex
dcf0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
dd00: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
dd10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
dd20: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
dd30: 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61   m |= pExpr->fla
dd40: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  gs;.    }.  }.  
dd50: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
dd60: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
dd70: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
dd80: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
dd90: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
dda0: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
ddb0: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
ddc0: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
ddd0: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
dde0: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
ddf0: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
de00: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
de10: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
de20: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
de30: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
de40: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
de50: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
de60: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
de70: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
de80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
de90: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
deb0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
dec0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
ded0: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
dee0: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
def0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
df00: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
df10: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
df20: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
df30: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
df40: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
df50: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
df60: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
df70: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
df80: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
df90: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
dfa0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
dfb0: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
dfc0: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
dfd0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
dfe0: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
dff0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
e000: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
e010: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
e020: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
e030: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
e040: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
e050: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
e060: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
e070: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
e080: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
e090: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
e0a0: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
e0b0: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
e0c0: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
e0d0: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
e0e0: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
e0f0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
e100: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
e110: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
e120: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
e130: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
e140: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
e150: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
e160: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
e170: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
e180: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
e190: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
e1a0: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
e1b0: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
e1c0: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
e1d0: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
e1e0: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
e1f0: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
e200: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
e210: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
e220: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
e230: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
e240: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
e250: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
e260: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
e270: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
e280: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
e290: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
e2a0: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
e2b0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
e2c0: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
e2d0: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
e2e0: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
e2f0: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
e300: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
e310: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
e320: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e330: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
e340: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
e350: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
e360: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e370: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
e380: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
e390: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
e3a0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
e3b0: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
e3c0: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
e3d0: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
e3e0: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
e3f0: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
e400: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
e410: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
e420: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
e430: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
e440: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
e450: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
e460: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
e470: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
e480: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
e490: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
e4a0: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
e4b0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
e4c0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
e4d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e4e0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e4f0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
e500: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
e510: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
e520: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
e530: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
e540: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
e550: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
e560: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
e570: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e580: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
e590: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
e5a0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
e5b0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
e5c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e5d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
e5e0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
e5f0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e600: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
e610: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
e620: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e630: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
e640: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
e650: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
e660: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
e670: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
e680: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
e690: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
e6a0: 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20  K_IF_NULL_ROW:. 
e6b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e6c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
e6d0: 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20  NULL_ROW );.    
e6e0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e6f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
e700: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
e710: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
e720: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  LE:.      if( pW
e730: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20  alker->eCode==5 
e740: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ){.        /* Si
e750: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62  lently convert b
e760: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
e770: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69  that appear insi
e780: 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20  de of CREATE.   
e790: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
e7a0: 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77  ts into a NULL w
e7b0: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
e7c0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
e7d0: 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20   text out.      
e7e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69    ** of the sqli
e7f0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e800: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
e810: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
e820: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e830: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
e840: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
e850: 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  A bound paramete
e860: 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74  r in a CREATE st
e870: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69  atement that ori
e880: 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20  ginates from.   
e890: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
e8a0: 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73  prepare() causes
e8b0: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
e8c0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e8d0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
e8e0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
e8f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
e900: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
e910: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
e920: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e930: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
e940: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
e950: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
e960: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
e970: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
e980: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e990: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
e9a0: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e9b0: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
e9c0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
e9d0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
e9e0: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
e9f0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
ea00: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
ea10: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
ea20: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
ea30: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
ea40: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65  d);.  pWalker->e
ea50: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Code = 0;.  retu
ea60: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
ea70: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
ea80: 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20  sConst(Expr *p, 
ea90: 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e  int initFlag, in
eaa0: 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65  t iCur){.  Walke
eab0: 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
eac0: 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78   initFlag;.  w.x
ead0: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
eae0: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
eaf0: 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
eb00: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e  llback = selectN
eb10: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 23  odeIsConstant;.#
eb20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
eb30: 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  UG.  w.xSelectCa
eb40: 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65  llback2 = sqlite
eb50: 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72  3SelectWalkAsser
eb60: 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e 75  t2;.#endif.  w.u
eb70: 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  .iCur = iCur;.  
eb80: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
eb90: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
eba0: 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
ebb0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
ebc0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
ebd0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
ebe0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ebf0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
ec00: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
ec10: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
ec20: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a  function calls..
ec30: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
ec40: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
ec50: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
ec60: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
ec70: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
ec80: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
ec90: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
eca0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
ecb0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
ecc0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
ecd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ece0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
ecf0: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
ed00: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
ed10: 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1, 0);.}../*.** 
ed20: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
ed30: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
ed40: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
ed50: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
ed60: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
ed70: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
ed80: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
ed90: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
eda0: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
edb0: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
edc0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
edd0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
ede0: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
edf0: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
ee00: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
ee10: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ee20: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
ee30: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
ee40: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
ee50: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 0);.}../*.** W
ee60: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
ee70: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
ee80: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
ee90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
eea0: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e  nstant.** for an
eeb0: 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  y single row of 
eec0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
eed0: 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20  ursor iCur.  In 
eee0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
eef0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  .** expression m
ef00: 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f  ust not refer to
ef10: 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   any non-determi
ef20: 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20  nistic function 
ef30: 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65  nor any.** table
ef40: 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72   other than iCur
ef50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ef60: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
ef70: 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ant(Expr *p, int
ef80: 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e   iCur){.  return
ef90: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
efa0: 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a  3, iCur);.}.../*
efb0: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
efc0: 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
efd0: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  sed by sqlite3Ex
efe0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
eff0: 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74  oupBy()..*/.stat
f000: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
f010: 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
f020: 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  By(Walker *pWalk
f030: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
f040: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  {.  ExprList *pG
f050: 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72  roupBy = pWalker
f060: 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20  ->u.pGroupBy;.  
f070: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65  int i;..  /* Che
f080: 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 69  ck if pExpr is i
f090: 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20  dentical to any 
f0a0: 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49  GROUP BY term. I
f0b0: 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20  f so, consider. 
f0c0: 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e   ** it constant.
f0d0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
f0e0: 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
f0f0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
f100: 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d  r *p = pGroupBy-
f110: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
f120: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f130: 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
f140: 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20  , p, -1)<2 ){.  
f150: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
f160: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
f170: 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d  CollSeq(pWalker-
f180: 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  >pParse, p);.   
f190: 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
f1a0: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
f1b0: 6d 70 28 22 42 49 4e 41 52 59 22 2c 20 70 43 6f  mp("BINARY", pCo
f1c0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ll->zName)==0 ){
f1d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f1e0: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
f1f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
f200: 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78 70  /* Check if pExp
f210: 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
f220: 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64  t. If so, consid
f230: 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20  er it variable. 
f240: 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
f250: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f260: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
f270: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
f280: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
f290: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
f2a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70   }..  return exp
f2b0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
f2c0: 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b  pWalker, pExpr);
f2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  .}../*.** Walk t
f2e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
f2f0: 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ee passed as the
f300: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
f310: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
f320: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
f330: 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65  ssion consists e
f340: 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74  ntirely of const
f350: 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f  ants or copies o
f360: 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70  f terms .** in p
f370: 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72  GroupBy that sor
f380: 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41 52  t with the BINAR
f390: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  Y collation sequ
f3a0: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ence..**.** This
f3b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
f3c0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
f3d0: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   a term of the H
f3e0: 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e  AVING clause can
f3f0: 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20  .** be promoted 
f400: 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  into the WHERE c
f410: 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72  lause.  In order
f420: 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d   for such a prom
f430: 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a  otion to work,.*
f440: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
f450: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
f460: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68   term must be th
f470: 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d  e same for all m
f480: 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22  embers of.** a "
f490: 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71  group".  The req
f4a0: 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
f4b0: 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20  e GROUP BY term 
f4c0: 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a  must be BINARY.*
f4d0: 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e  * assumes that n
f4e0: 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e  o other collatin
f4f0: 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  g sequence will 
f500: 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61  have a finer-gra
f510: 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  ined.** grouping
f520: 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49   than binary.  I
f530: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41  n other words (A
f540: 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72  =B COLLATE binar
f550: 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d  y) implies.** A=
f560: 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72  B in every other
f570: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
f580: 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69 72  nce.  The requir
f590: 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a  ement that the.*
f5a0: 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42 49  * GROUP BY be BI
f5b0: 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65 72  NARY is stricter
f5c0: 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e   than necessary.
f5d0: 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20    It would also 
f5e0: 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f  work.** to promo
f5f0: 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  te HAVING clause
f600: 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73  s that use the s
f610: 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ame alternative 
f620: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
f630: 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f  uence as the GRO
f640: 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20  UP BY term, but 
f650: 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61 72  that is much har
f660: 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a  der to check,.**
f670: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
f680: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
f690: 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61   are uncommon, a
f6a0: 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20  nd this is only 
f6b0: 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  an.** optimizati
f6c0: 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74  on, so we take t
f6d0: 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74 20  he easy way out 
f6e0: 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69  and simply requi
f6f0: 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20  re the.** GROUP 
f700: 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42 49  BY to use the BI
f710: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73  NARY collating s
f720: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20  equence..*/.int 
f730: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f740: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50  stantOrGroupBy(P
f750: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
f760: 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  pr *p, ExprList 
f770: 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61  *pGroupBy){.  Wa
f780: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64  lker w;.  w.eCod
f790: 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
f7a0: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
f7b0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  odeIsConstantOrG
f7c0: 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c  roupBy;.  w.xSel
f7d0: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
f7e0: 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79 20  .  w.u.pGroupBy 
f7f0: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  = pGroupBy;.  w.
f800: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
f810: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
f820: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
f830: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
f840: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
f850: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
f860: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
f870: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f880: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
f890: 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63   or a function c
f8a0: 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e  all with constan
f8b0: 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
f8c0: 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68  turn and 0 if th
f8d0: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76  ere.** are any v
f8e0: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
f8f0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
f900: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
f910: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
f920: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
f930: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
f940: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
f950: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
f960: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
f970: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
f980: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
f990: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
f9a0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
f9b0: 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73  n(Expr *p, u8 is
f9c0: 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28  Init){.  assert(
f9d0: 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73   isInit==0 || is
f9e0: 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Init==1 );.  ret
f9f0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fa00: 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b  p, 4+isInit, 0);
fa10: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
fa20: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
fa30: 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  HINTS./*.** Walk
fa40: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
fa50: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
fa60: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
fa70: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73   contains a.** s
fa80: 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20  ubquery of some 
fa90: 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20  kind.  Return 0 
faa0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
fab0: 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69  subqueries..*/.i
fac0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
fad0: 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45  ntainsSubquery(E
fae0: 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65  xpr *p){.  Walke
faf0: 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
fb00: 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   1;.  w.xExprCal
fb10: 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
fb20: 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
fb30: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
fb40: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
fb50: 6f 6e 73 74 61 6e 74 3b 0a 23 69 66 64 65 66 20  onstant;.#ifdef 
fb60: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77  SQLITE_DEBUG.  w
fb70: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
fb80: 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  2 = sqlite3Selec
fb90: 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65  tWalkAssert2;.#e
fba0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61  ndif.  sqlite3Wa
fbb0: 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
fbc0: 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d   return w.eCode=
fbd0: 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  =0;.}.#endif../*
fbe0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
fbf0: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
fc00: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
fc10: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
fc20: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
fc30: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
fc40: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
fc50: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
fc60: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
fc70: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
fc80: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
fc90: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
fca0: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
fcb0: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
fcc0: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
fcd0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
fce0: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
fcf0: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
fd00: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
fd10: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
fd20: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
fd30: 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  lue){.  int rc =
fd40: 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   0;.  if( p==0 )
fd50: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
fd60: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66  an only happen f
fd70: 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20  ollowing on OOM 
fd80: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  */..  /* If an e
fd90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
fda0: 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
fdb0: 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
fdc0: 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
fdd0: 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
fde0: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
fdf0: 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
fe00: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
fe10: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
fe20: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
fe30: 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
fe40: 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
fe50: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
fe60: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
fe70: 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
fe80: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
fe90: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
fea0: 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
feb0: 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
fec0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
fed0: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
fee0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
fef0: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
ff00: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
ff10: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
ff20: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
ff30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ff40: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
ff50: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
ff60: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
ff70: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
ff80: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
ff90: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
ffa0: 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36  t( v!=(-21474836
ffb0: 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  47-1) );.       
ffc0: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
ffd0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
ffe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fff0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
10000 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
10010 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10020 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ../*.** Return F
10030 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73  ALSE if there is
10040 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
10050 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10060 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  an be NULL..**.*
10070 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
10080 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ion might be NUL
10090 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  L or if the expr
100a0 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f  ession is too co
100b0 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c  mplex.** to tell
100c0 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a   return TRUE.  .
100d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
100e0 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ne is used as an
100f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
10100 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c  o skip OP_IsNull
10110 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e   opcodes.** when
10120 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
10130 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
10140 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20  NULL.  Hence, a 
10150 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a  false positive.*
10160 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55  * (returning TRU
10170 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74  E when in fact t
10180 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
10190 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29  n never be NULL)
101a0 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73   might.** be a s
101b0 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
101c0 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65   hit but is othe
101d0 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20  rwise harmless. 
101e0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   On the other.**
101f0 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e   hand, a false n
10200 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69  egative (returni
10210 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68  ng FALSE when th
10220 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62  e result could b
10230 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20  e NULL).** will 
10240 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
10250 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
10260 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69  swer.  So when i
10270 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a  n doubt, return.
10280 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20  ** TRUE..*/.int 
10290 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
102a0 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20  Null(const Expr 
102b0 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  *p){.  u8 op;.  
102c0 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
102d0 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
102e0 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
102f0 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
10300 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
10310 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
10320 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
10330 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
10340 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
10350 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
10360 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
10370 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
10380 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20   case TK_BLOB:. 
10390 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
103a0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
103b0 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
103c0 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20   p->pTab!=0 );. 
103d0 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
103e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
103f0 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d               (p-
10410 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
10420 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  ->pTab->aCol[p->
10430 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
10440 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
10450 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
10460 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
10470 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
10480 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
10490 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
104a0 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
104b0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
104c0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
104d0 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
104e0 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
104f0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
10500 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10510 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
10520 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
10530 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
10540 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
10550 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
10560 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
10570 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
10580 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
10590 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
105a0 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
105b0 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
105c0 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
105d0 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
105e0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
105f0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
10600 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
10610 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
10620 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
10630 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
10640 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
10650 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
10660 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
10670 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
10680 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
10690 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
106a0 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
106b0 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
106c0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
106d0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
106e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
106f0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
10700 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
10710 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
10720 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
10730 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
10740 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
10750 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
10760 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
10770 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
10780 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
10790 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
107a0 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
107b0 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
107c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
107d0 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
107e0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
107f0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
10800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10810 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
10820 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
10830 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
10840 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
10850 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
10860 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
10870 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
10880 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
10890 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
108a0 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
108b0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
108c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
108d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
108e0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
108f0 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
10900 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
10910 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
10920 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
10930 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
10940 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
10950 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
10960 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
10970 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
10980 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
10990 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
109a0 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
109b0 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
109c0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
109d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
109e0 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
109f0 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
10a00 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
10a10 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
10a20 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
10a30 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
10a40 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
10a50 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
10a60 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
10a70 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
10a80 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
10a90 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
10aa0 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
10ab0 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
10ac0 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
10ad0 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
10ae0 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
10af0 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
10b00 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
10b10 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
10b20 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
10b30 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
10b40 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
10b50 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
10b60 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
10b70 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
10b80 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
10b90 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
10ba0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
10bb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
10bc0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
10bd0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
10be0 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
10bf0 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
10c00 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
10c10 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
10c20 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
10c30 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
10c40 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
10c50 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
10c60 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
10c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10c80 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
10c90 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
10ca0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
10cb0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
10cc0 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
10cd0 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
10ce0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
10cf0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
10d00 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
10d10 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
10d20 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
10d30 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
10d40 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
10d50 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
10d60 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
10d70 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
10d80 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
10d90 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
10da0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
10db0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10dd0 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
10de0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
10df0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
10e00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
10e10 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
10e20 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
10e30 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
10e40 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
10e50 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
10e60 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
10e70 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
10e80 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ea0 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
10eb0 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
10ec0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
10ed0 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
10ee0 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
10ef0 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
10f00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
10f10 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
10f20 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
10f30 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
10f40 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
10f50 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
10f60 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
10f70 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
10f80 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
10f90 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
10fa0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10fb0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
10fc0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
10fd0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
10fe0 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
10ff0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
11000 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
11010 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
11020 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
11030 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
11040 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
11050 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  st;.  assert( pE
11060 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  List!=0 );.  /* 
11070 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c  All SELECT resul
11080 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d  ts must be colum
11090 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ns. */.  for(i=0
110a0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
110b0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
110c0 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74  r *pRes = pEList
110d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
110e0 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d    if( pRes->op!=
110f0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
11100 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74  rn 0;.    assert
11110 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d  ( pRes->iTable==
11120 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
11130 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  or );  /* Not a 
11140 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
11150 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ery */.  }.  ret
11160 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn p;.}.#endif 
11170 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
11180 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
11190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
111a0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
111b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
111c0 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66  t checks the lef
111d0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
111e0 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75   index table iCu
111f0 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69  r to see if.** i
11200 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  t contains any N
11210 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61  ULL entries.  Ca
11220 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
11230 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74   at regHasNull t
11240 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  o be set.** to a
11250 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
11260 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
11270 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73   no NULLs.  Caus
11280 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61  e register regHa
11290 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73  sNull.** to be s
112a0 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43  et to NULL if iC
112b0 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ur contains one 
112c0 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
112d0 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
112e0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61  oid sqlite3SetHa
112f0 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a  sNullFlag(Vdbe *
11300 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74  v, int iCur, int
11310 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20   regHasNull){.  
11320 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c  int addr1;.  sql
11330 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11340 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
11350 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
11360 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
11370 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11380 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56  Rewind, iCur); V
11390 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
113a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
113b0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
113c0 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61  , iCur, 0, regHa
113d0 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  sNull);.  sqlite
113e0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
113f0 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
11400 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  G);.  VdbeCommen
11410 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74  t((v, "first_ent
11420 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72  ry_in(%d)", iCur
11430 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
11440 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11450 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  r1);.}.#endif...
11460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11470 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
11480 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
11490 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
114a0 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e  r with a list (n
114b0 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f  ot a subquery) o
114c0 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d  n the .** right-
114d0 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75  hand side.  Retu
114e0 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20  rn TRUE if that 
114f0 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  list is constant
11500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11510 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
11520 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e  nstant(Expr *pIn
11530 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b  ){.  Expr *pLHS;
11540 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
11550 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
11560 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78  operty(pIn, EP_x
11570 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70  IsSelect) );.  p
11580 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74  LHS = pIn->pLeft
11590 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
115a0 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69   0;.  res = sqli
115b0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
115c0 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70  t(pIn);.  pIn->p
115d0 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72  Left = pLHS;.  r
115e0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e  eturn res;.}.#en
115f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
11600 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
11610 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
11620 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
11630 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
11640 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d  .** The pX param
11650 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72  eter is the expr
11660 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48  ession on the RH
11670 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
11680 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d  ator, which.** m
11690 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61  ight be either a
116a0 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
116b0 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65  ions or a subque
116c0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  ry..**.** The jo
116d0 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
116e0 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  e is to find or 
116f0 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
11700 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a  object that can.
11710 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65  ** be used eithe
11720 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65  r to test for me
11730 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20  mbership in the 
11740 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74  RHS set or to it
11750 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
11760 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
11770 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69  the RHS set, ski
11780 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
11790 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ..**.** A cursor
117a0 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
117b0 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  e b-tree object 
117c0 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20  that is the RHS 
117d0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
117e0 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54  or.** and pX->iT
117f0 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
11800 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
11810 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
11820 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
11830 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
11840 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
11850 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
11860 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
11870 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
11880 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
11890 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
118a0 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
118b0 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
118c0 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68  _INDEX_ASC  - Th
118d0 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
118e0 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  ned on an ascend
118f0 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
11900 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
11910 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72  ESC - The cursor
11920 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
11930 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
11940 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
11950 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68  _EPH        - Th
11960 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
11970 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
11980 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
11990 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
119a0 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
119b0 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
119c0 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
119d0 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20  EX_NOOP       - 
119e0 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c  No cursor was al
119f0 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e  located.  The IN
11a00 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
11a10 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
11a30 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65  lemented as a se
11a40 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
11a50 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  isons..**.** An 
11a60 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20  existing b-tree 
11a70 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66  might be used if
11a80 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73   the RHS express
11a90 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70  ion pX is a simp
11aa0 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73  le.** subquery s
11ab0 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  uch as:.**.**   
11ac0 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
11ad0 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e  1>, <column2>...
11ae0 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
11af0 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
11b00 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
11b10 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
11b20 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
11b30 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
11b40 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
11b50 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
11b60 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
11b70 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
11b80 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
11b90 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
11ba0 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  to the ephemeral
11bb0 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
11bc0 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  f an.** existing
11bd0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
11be0 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65  e inFlags parame
11bf0 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ter must contain
11c00 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   exactly one of 
11c10 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49  the bits.** IN_I
11c20 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
11c30 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  or IN_INDEX_LOOP
11c40 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
11c50 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
11c60 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
11c70 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
11c80 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
11c90 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61  used for a.** fa
11ca0 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  st membership te
11cb0 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
11cc0 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
11cd0 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49  is set, the.** I
11ce0 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20  N index will be 
11cf0 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
11d00 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
11d10 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a  the RHS of the.*
11d20 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  * IN operator..*
11d30 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
11d40 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20  EX_LOOP is used 
11d50 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
11d60 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
11d70 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
11d80 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
11d90 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74  rs) then the b-t
11da0 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e  ree must not con
11db0 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e  tain duplicates.
11dc0 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c  .** An epheremal
11dd0 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
11de0 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
11df0 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20  elected columns 
11e00 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a  are guaranteed.*
11e10 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
11e20 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
11e30 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
11e40 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
11e50 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51  due to.** a UNIQ
11e60 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
11e70 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68   index..**.** Wh
11e80 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  en IN_INDEX_MEMB
11e90 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28  ERSHIP is used (
11ea0 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
11eb0 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
11ec0 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d  for fast set mem
11ed0 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74  bership tests) t
11ee0 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  hen an epheremal
11ef0 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
11f00 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
11f10 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69  columns> is a si
11f20 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49  ngle INTEGER PRI
11f30 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
11f40 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20  or an .** index 
11f50 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74  can be found wit
11f60 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
11f70 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73  <columns> as its
11f80 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a   left-most..**.*
11f90 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
11fa0 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
11fb0 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
11fc0 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
11fd0 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
11fe0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
11ff0 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
12000 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
12010 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
12020 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
12030 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
12040 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
12050 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
12060 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
12070 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
12080 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
12090 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
120a0 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
120b0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
120c0 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
120d0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
120e0 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
120f0 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
12100 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
12110 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
12120 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
12130 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
12140 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
12150 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
12160 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
12170 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
12180 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
12190 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
121a0 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
121b0 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
121c0 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
121d0 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
121e0 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
121f0 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
12200 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
12210 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
12220 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
12230 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
12240 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
12250 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
12260 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
12270 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
12280 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
12290 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
122a0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
122b0 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
122c0 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
122d0 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
122e0 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
122f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
12300 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
12310 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
12320 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
12330 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
12340 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
12350 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
12360 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
12370 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
12380 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
12390 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
123a0 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
123b0 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
123c0 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
123d0 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
123e0 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
123f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61  *.** If the aiMa
12400 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  p parameter is n
12410 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74  ot NULL, it must
12420 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
12430 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  ay containing.**
12440 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72   one element for
12450 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74   each column ret
12460 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
12470 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
12480 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74   the RHS.** of t
12490 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  he IN(...) opera
124a0 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e  tor. The i'th en
124b0 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79  try of the array
124c0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
124d0 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74  th the.** offset
124e0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
124f0 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65  lumn that matche
12500 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d  s the i'th colum
12510 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
12520 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72  e.** SELECT. For
12530 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
12540 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
12550 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61  selected index a
12560 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f  re:.**.**   (?,?
12570 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61  ,?) IN (SELECT a
12580 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a  , b, c FROM t1).
12590 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
125a0 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c  X i1 ON t1(b, c,
125b0 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   a);.**.** then 
125c0 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c  aiMap[] is popul
125d0 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c  ated with {2, 0,
125e0 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   1}..*/.#ifndef 
125f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12600 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
12610 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50  FindInIndex(.  P
12620 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
12640 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12650 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20    Expr *pX,     
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12670 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
12680 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65  ide (RHS) of the
12690 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
126a0 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20    u32 inFlags,  
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
126c0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f  IN_INDEX_LOOP, _
126d0 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f  MEMBERSHIP, and/
126e0 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20  or _NOOP_OK */. 
126f0 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75   int *prRhsHasNu
12700 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ll,         /* R
12710 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
12720 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65  NULL status.  Se
12730 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74  e notes */.  int
12740 20 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20 20   *aiMap         
12750 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
12760 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69  ng from Index fi
12770 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c  elds to RHS fiel
12780 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ds */.){.  Selec
12790 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
127c0 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
127d0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
127e0 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
12810 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
12820 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
12830 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
12840 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
12850 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
12860 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
12870 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20  t mustBeUnique; 
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12890 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52      /* True if R
128a0 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
128b0 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
128c0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
128d0 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
128e0 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
128f0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
12900 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
12910 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73  ==TK_IN );.  mus
12920 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46  tBeUnique = (inF
12930 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
12940 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  LOOP)!=0;..  /* 
12950 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
12960 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  is IN(...) opera
12970 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c  tor is a SELECT,
12980 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65   and if it matte
12990 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  rs .  ** whether
129a0 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45   or not the SELE
129b0 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  CT result contai
129c0 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ns NULL values, 
129d0 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20  check whether.  
129e0 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69  ** or not NULL i
129f0 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
12a00 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20  ble (it may not 
12a10 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  be, for example,
12a20 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f   due .  ** to NO
12a30 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
12a40 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
12a50 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61  ). If no NULL va
12a60 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  lues are possibl
12a70 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68  e,.  ** set prRh
12a80 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65  sHasNull to 0 be
12a90 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
12aa0 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73    */.  if( prRhs
12ab0 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e  HasNull && (pX->
12ac0 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
12ad0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  lect) ){.    int
12ae0 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   i;.    ExprList
12af0 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78   *pEList = pX->x
12b00 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
12b10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
12b20 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
12b30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
12b40 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
12b50 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69  Null(pEList->a[i
12b60 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b  ].pExpr) ) break
12b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12b80 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  i==pEList->nExpr
12b90 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48   ){.      prRhsH
12ba0 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  asNull = 0;.    
12bb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
12bc0 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
12bd0 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
12be0 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
12bf0 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
12c00 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
12c10 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
12c20 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
12c30 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
12c40 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f  meral table.  */
12c50 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
12c60 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69  Err==0 && (p = i
12c70 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
12c80 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20  pt(pX))!=0 ){.  
12c90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12ca0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
12cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
12cc0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12cd0 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
12ce0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d00 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
12d10 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d40 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
12d50 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78  r pTab */.    Ex
12d60 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
12d70 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
12d80 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69  int nExpr = pELi
12d90 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
12da0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
12db0 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
12dc0 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
12dd0 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
12de0 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
12df0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
12e00 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  t->a[0].pExpr!=0
12e10 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f   ); /* Because o
12e20 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
12e30 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
12e40 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
12e50 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
12e60 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
12e70 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
12e80 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
12e90 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
12ea0 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20  a[0].pTab;..    
12eb0 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
12ec0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
12ed0 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
12ee0 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
12ef0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12f00 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
12f10 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
12f20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
12f30 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
12f40 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
12f50 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
12f60 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
12f70 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
12f80 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65  Name);..    asse
12f90 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74  rt(v);  /* sqlit
12fa0 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73 20  e3GetVdbe() has 
12fb0 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65 76  always been prev
12fc0 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f  iously called */
12fd0 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d  .    if( nExpr==
12fe0 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
12ff0 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
13000 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  <0 ){.      /* T
13010 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  he "x IN (SELECT
13020 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c   rowid FROM tabl
13030 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  e)" case */.    
13040 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
13050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13060 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20  v, OP_Once);.   
13070 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
13080 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  v);..      sqlit
13090 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
130a0 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
130b0 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
130c0 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
130d0 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
130e0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
130f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
13100 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
13110 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
13120 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13140 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
13150 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
13160 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a  ffinity_ok = 1;.
13170 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20        int i;..  
13180 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
13190 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
131a0 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
131b0 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68   to perform each
131c0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
131d0 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
131e0 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
131f0 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  y of each column
13200 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20   in table.      
13210 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ** on the RHS of
13220 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
13230 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74  .  If it not, it
13240 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
13250 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65   to.      ** use
13260 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68   any index of th
13270 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f  e RHS table.  */
13280 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
13290 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e  i<nExpr && affin
132a0 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20  ity_ok; i++){.  
132b0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
132c0 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
132d0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
132e0 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
132f0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
13300 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
13310 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
13320 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
13330 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f  = sqlite3TableCo
13340 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61  lumnAffinity(pTa
13350 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20  b,iCol); /* RHS 
13360 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
13370 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73   char cmpaff = s
13380 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
13390 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61  inity(pLhs, idxa
133a0 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ff);.        tes
133b0 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
133c0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
133d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
133e0 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49  se( cmpaff==SQLI
133f0 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
13400 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63         switch( c
13410 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  mpaff ){.       
13420 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
13430 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20  FF_BLOB:.       
13440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13450 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
13460 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
13470 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
13480 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
13490 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73  y() only returns
134a0 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64   TEXT if one sid
134b0 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20  e or the.       
134c0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61       ** other ha
134d0 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e  s no affinity an
134e0 64 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  d the other side
134f0 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65   is TEXT.  Hence
13500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ,.            **
13510 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f   the only way fo
13520 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54  r cmpaff to be T
13530 45 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66  EXT is for idxaf
13540 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20  f to be TEXT.   
13550 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
13560 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20  for the term on 
13570 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
13580 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66  N to have no aff
13590 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  inity. */.      
135a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
135b0 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  xaff==SQLITE_AFF
135c0 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
135d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
135e0 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
135f0 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e             affin
13600 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
13610 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
13620 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  y(idxaff);.     
13630 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
13640 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79      if( affinity
13650 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _ok ){.        /
13660 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
13670 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74  existing index t
13680 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f  hat will work fo
13690 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
136a0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  or */.        fo
136b0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
136c0 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
136d0 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78  pe==0; pIdx=pIdx
136e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
136f0 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55      Bitmask colU
13700 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c  sed;      /* Col
13710 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
13720 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  x used */.      
13730 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c      Bitmask mCol
13740 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
13750 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  k for the curren
13760 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20  t column */.    
13770 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
13780 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20  nColumn<nExpr ) 
13790 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
137a0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
137b0 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
137c0 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
137d0 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
137e0 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
137f0 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
13800 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
13810 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
13820 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
13830 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
13840 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
13850 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
13860 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
13870 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
13880 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
13890 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
138a0 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
138b0 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
138c0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
138d0 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
138e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
138f0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
13900 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
13910 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
13920 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
13930 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
13940 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
13950 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
13960 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
13970 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
13980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13990 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
139a0 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
139b0 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
139c0 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
139d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
139e0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
139f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
13a00 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
13a10 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
13a20 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
13a30 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
13a40 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
13a50 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
13a60 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
13a70 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
13a80 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
13a90 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
13aa0 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
13ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
13ac0 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
13ad0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
13ae0 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
13af0 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
13b00 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
13b10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
13b20 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
13b30 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
13b40 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
13b50 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
13b60 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
13b70 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
13b80 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
13b90 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
13bb0 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
13bc0 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
13bd0 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
13be0 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
13c00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
13c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13c20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13c30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13c40 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
13c50 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
13c60 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
13c70 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
13c80 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
13c90 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
13ca0 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
13cb0 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
13cc0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
13cd0 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
13ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
13cf0 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
13d00 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
13d10 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
13d20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
13d30 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
13d40 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
13d50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
13d60 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
13d70 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
13d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
13d90 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
13da0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
13db0 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
13dc0 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
13dd0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
13de0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
13df0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
13e00 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
13e10 67 65 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53  ge(v);.#ifndef S
13e20 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
13e30 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  IN.            s
13e40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13e50 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
13e60 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  0, 0, 0,.       
13e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
13e80 72 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47  rintf(db, "USING
13e90 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e   INDEX %s FOR IN
13ea0 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d  -OPERATOR",pIdx-
13eb0 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  >zName),.       
13ec0 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49         P4_DYNAMI
13ed0 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  C);.#endif.     
13ee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13ef0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
13f00 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
13f10 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
13f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
13f30 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
13f40 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
13f50 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
13f60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
13f70 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
13f80 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
13f90 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45   assert( IN_INDE
13fa0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20  X_INDEX_DESC == 
13fb0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
13fc0 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  SC+1 );.        
13fd0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
13fe0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
13ff0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
14000 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20  r[0];.  .       
14010 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
14020 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20  sNull ){.#ifdef 
14030 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
14040 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34               i64
14060 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
14070 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
14080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14090 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
140a0 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20  ColumnsUsed, .  
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140c0 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a  iTab, 0, 0, (u8*
140d0 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34  )&mask, P4_INT64
140e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
140f0 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
14100 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
14110 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
14120 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d        if( nExpr=
14130 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
14140 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
14150 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
14160 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
14170 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
14180 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14190 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
141a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
141b0 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
141c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
141d0 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
141e0 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a  over indexes */.
141f0 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69        } /* End i
14200 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
14210 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64   */.    } /* End
14220 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64   if not an rowid
14230 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a   index */.  } /*
14240 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20   End attempt to 
14250 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61  optimize using a
14260 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a  n index */..  /*
14270 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
14280 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
14290 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
142a0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
142b0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
142c0 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
142d0 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
142e0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
142f0 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
14300 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
14310 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
14320 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  S is not constan
14330 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20  t or has two or 
14340 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a  fewer terms,.  *
14350 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
14360 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20   worth creating 
14370 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
14380 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  le to evaluate. 
14390 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61   ** the IN opera
143a0 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e  tor so return IN
143b0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a  _INDEX_NOOP..  *
143c0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  /.  if( eType==0
143d0 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20  .   && (inFlags 
143e0 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  & IN_INDEX_NOOP_
143f0 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48  OK).   && !ExprH
14400 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
14410 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
14420 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68  && (!sqlite3InRh
14430 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20  sIsConstant(pX) 
14440 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pX->x.pList->
14450 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20  nExpr<=2).  ){. 
14460 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
14470 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  DEX_NOOP;.  }.. 
14480 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
14490 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
144a0 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
144b0 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
144c0 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
144d0 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
144e0 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
144f0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
14500 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
14510 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
14520 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
14530 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
14540 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
14550 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
14560 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
14570 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
14580 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
14590 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
145a0 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
145b0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
145c0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
145d0 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
145e0 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
145f0 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
14600 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
14610 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
14620 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
14630 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14640 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
14650 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
14660 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
14670 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
14680 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
14690 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
146a0 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
146b0 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
146c0 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
146d0 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20  DEX_ROWID);.    
146e0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
146f0 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79  op = savedNQuery
14700 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Loop;.  }else{. 
14710 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
14720 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  iTab;.  }..  if(
14730 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21   aiMap && eType!
14740 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
14750 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e  ASC && eType!=IN
14760 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
14770 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  C ){.    int i, 
14780 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  n;.    n = sqlit
14790 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
147a0 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
147b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
147c0 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69  ++) aiMap[i] = i
147d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
147e0 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
147f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14800 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
14810 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70  ** Argument pExp
14820 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e  r is an (?, ?...
14830 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  ) IN(...) expres
14840 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66  sion. This .** f
14850 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
14860 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
14870 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
14880 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
14890 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74   .** the affinit
148a0 69 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66  ies to be used f
148b0 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
148c0 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
148d0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68  ..**.** It is th
148e0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
148f0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
14900 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
14910 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74  e returned.** st
14920 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c  ring is eventual
14930 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73  ly freed using s
14940 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
14950 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
14960 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50  exprINAffinity(P
14970 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
14980 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
14990 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
149a0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20  r->pLeft;.  int 
149b0 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  nVal = sqlite3Ex
149c0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
149d0 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ft);.  Select *p
149e0 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d  Select = (pExpr-
149f0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
14a00 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e  elect) ? pExpr->
14a10 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20  x.pSelect : 0;. 
14a20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
14a30 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
14a40 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52  p==TK_IN );.  zR
14a50 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
14a60 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e  llocRaw(pParse->
14a70 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69  db, nVal+1);.  i
14a80 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69  f( zRet ){.    i
14a90 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
14aa0 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
14ab0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20  .      Expr *pA 
14ac0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
14ad0 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
14ae0 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61  t, i);.      cha
14af0 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  r a = sqlite3Exp
14b00 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20  rAffinity(pA);. 
14b10 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74       if( pSelect
14b20 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
14b30 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  [i] = sqlite3Com
14b40 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65  pareAffinity(pSe
14b50 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
14b60 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20  i].pExpr, a);.  
14b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14b80 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a     zRet[i] = a;.
14b90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14ba0 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27    zRet[nVal] = '
14bb0 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  \0';.  }.  retur
14bc0 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
14bd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14be0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
14bf0 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61  *.** Load the Pa
14c00 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  rse object passe
14c10 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
14c20 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  rgument with an 
14c30 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
14c40 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
14c50 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
14c60 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
14c70 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
14c80 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  M".*/   .void sq
14c90 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
14ca0 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
14cb0 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20  e, int nActual, 
14cc0 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20  int nExpect){.  
14cd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
14ce0 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72   = "sub-select r
14cf0 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e  eturns %d column
14d00 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22  s - expected %d"
14d10 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
14d20 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74  Msg(pParse, zFmt
14d30 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65  , nActual, nExpe
14d40 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ct);.}.#endif../
14d50 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
14d60 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f  pExpr is a vecto
14d70 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  r that has been 
14d80 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78  used in a contex
14d90 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73  t where.** it is
14da0 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
14db0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75  If pExpr is a su
14dc0 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c  b-select vector,
14dd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a   this routine .*
14de0 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73  * loads the Pars
14df0 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20  e object with a 
14e00 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
14e10 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
14e20 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
14e30 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
14e40 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f  ected 1".**.** O
14e50 72 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  r, if it is a re
14e60 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63  gular scalar vec
14e70 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f  tor:.**.**   "ro
14e80 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
14e90 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
14ea0 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
14eb0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
14ec0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23   Expr *pExpr){.#
14ed0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14ee0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
14ef0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
14f00 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b   EP_xIsSelect ){
14f10 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73  .    sqlite3Subs
14f20 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
14f30 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  e, pExpr->x.pSel
14f40 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
14f50 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a  pr, 1);.  }else.
14f60 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
14f70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14f80 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
14f90 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d  e misused");.  }
14fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
14fb0 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
14fc0 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
14fd0 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
14fe0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49   expression, EXI
14ff0 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70  STS,.** or IN op
15000 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
15010 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
15020 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
15030 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
15040 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
15050 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
15060 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
15070 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
15080 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
15090 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
150a0 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
150b0 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
150c0 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
150d0 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
150e0 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
150f0 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
15100 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
15110 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
15120 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
15130 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
15140 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
15150 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
15160 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
15170 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
15180 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
15190 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
151a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
151b0 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
151c0 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
151d0 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
151e0 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
151f0 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
15200 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
15210 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
15220 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
15230 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
15240 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
15250 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
15260 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
15270 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
15280 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
15290 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
152a0 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
152b0 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
152c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
152d0 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
152e0 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
152f0 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
15300 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
15310 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
15320 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
15330 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
15340 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
15350 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  ** All this rout
15360 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
15370 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73  ialize the regis
15380 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
15390 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  yHaveNull.** to 
153a0 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
153b0 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
153c0 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  e care of changi
153d0 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
153e0 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  .** value to non
153f0 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
15400 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
15410 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43  *.** For a SELEC
15420 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  T or EXISTS oper
15430 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ator, return the
15440 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
15450 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  olds the.** resu
15460 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69  lt.  For a multi
15470 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20  -column SELECT, 
15480 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
15490 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67  ored in a contig
154a0 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66  uous.** array of
154b0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
154c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
154d0 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  is the register 
154e0 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
154f0 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
15500 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72  n.  Return 0 for
15510 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
15520 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
15530 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  urs..*/.#ifndef 
15540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
15550 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
15560 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
15570 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15580 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
15590 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
155a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
155b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
155c0 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
155d0 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
155e0 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c  /.  int rHasNull
155f0 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52  Flag,       /* R
15600 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
15610 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
15620 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
15630 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15650 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
15660 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
15670 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
15680 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20  nt jmpIfDynamic 
15690 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
156a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
156b0 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
156c0 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
156d0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
15700 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
15710 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
15720 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15730 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
15740 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
15750 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
15760 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
15770 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76  e);..  /* The ev
15780 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
15790 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54  IN/EXISTS/SELECT
157a0 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65   must be repeate
157b0 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a  d every time it.
157c0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
157d0 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  red if any of th
157e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
157f0 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
15800 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
15810 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
15820 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
15830 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
15840 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
15850 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
15860 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
15870 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
15880 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
15890 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
158a0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
158b0 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
158c0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
158d0 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
158e0 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
158f0 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
15900 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
15910 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
15920 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
15930 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
15940 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
15950 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
15960 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
15970 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73  jmpIfDynamic = s
15980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
15990 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
159a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
159b0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
159c0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
159d0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
159e0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
159f0 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
15a00 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
15a10 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45  se->db, "EXECUTE
15a20 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25   %s%s SUBQUERY %
15a30 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49  d",.        jmpI
15a40 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22  fDynamic>=0?"":"
15a50 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20  CORRELATED ",.  
15a60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
15a70 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53  =TK_IN?"LIST":"S
15a80 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20  CALAR",.        
15a90 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15aa0 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20  ectId.    );.   
15ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ac0 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
15ad0 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
15ae0 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
15af0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
15b00 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74  }.#endif..  swit
15b10 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
15b20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
15b30 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
15b40 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
15b50 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
15b60 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
15b70 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
15b80 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
15b90 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
15ba0 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20  eft; /* the LHS 
15bb0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
15bc0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49  or */.      KeyI
15bd0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
15be0 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69  0;      /* Key i
15bf0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
15c00 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20      int nVal;   
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f  /* Size of vecto
15c30 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20  r pLeft */.     
15c40 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73   .      nVal = s
15c50 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
15c60 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  Size(pLeft);.   
15c70 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
15c80 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29  wid || nVal==1 )
15c90 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
15ca0 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
15cb0 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
15cc0 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
15cd0 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
15ce0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
15cf0 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
15d00 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70  same way.  An ep
15d10 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73  hemeral table is
15d20 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
15d30 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65 79  d with index key
15d40 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
15d50 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
15d60 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45  the .      ** SE
15d70 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
15d80 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
15d90 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
15da0 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
15db0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
15dc0 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
15dd0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
15de0 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
15df0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
15e00 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
15e10 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
15e20 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
15e30 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
15e40 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
15e50 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
15e60 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
15e70 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
15e80 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
15e90 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
15ea0 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
15eb0 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
15ec0 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
15ed0 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
15ee0 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
15ef0 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
15f00 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
15f10 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
15f20 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
15f30 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
15f40 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
15f50 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
15f60 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
15f70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
15f80 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
15f90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
15fa0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20  enEphemeral, .  
15fb0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
15fc0 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f  Table, (isRowid?
15fd0 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20 20  0:nVal));.      
15fe0 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77  pKeyInfo = isRow
15ff0 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  id ? 0 : sqlite3
16000 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
16010 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31  rse->db, nVal, 1
16020 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  );..      if( Ex
16030 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16040 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
16050 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
16060 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
16070 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
16080 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
16090 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
160a0 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
160b0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
160c0 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
160d0 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
160e0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
160f0 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
16100 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
16110 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
16120 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45  ct *pSelect = pE
16130 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
16140 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
16150 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65   *pEList = pSele
16160 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20  ct->pEList;..   
16170 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
16180 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
16190 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61   /* If the LHS a
161a0 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  nd RHS of the IN
161b0 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
161c0 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20   match, that.   
161d0 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69       ** error wi
161e0 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75  ll have been cau
161f0 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20  ght long before 
16200 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
16210 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  int. */.        
16220 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73  if( ALWAYS(pELis
16230 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20  t->nExpr==nVal) 
16240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
16250 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
16260 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
16270 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16280 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
16290 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
162a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
162b0 20 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41           dest.zA
162c0 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41  ffSdst = exprINA
162d0 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
162e0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
162f0 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
16300 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
16310 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65   testcase( pSele
16320 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
16330 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
16340 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16350 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b  ( pKeyInfo==0 );
16360 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f   /* Caused by OO
16370 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  M in sqlite3KeyI
16380 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  nfoAlloc() */.  
16390 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
163a0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
163b0 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
163c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
163d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
163e0 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e  Parse->db, dest.
163f0 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  zAffSdst);.     
16400 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
16410 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
16420 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
16430 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
16440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16450 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16460 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74  pParse->db, dest
16470 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20  .zAffSdst);.    
16480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
16490 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20  eyInfo!=0 ); /* 
164a0 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65  OOM will cause e
164b0 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65  xit after sqlite
164c0 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20  3Select() */.   
164d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
164e0 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
164f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
16500 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
16510 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
16520 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
16530 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
16540 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
16550 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
16560 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
16570 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
16580 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
16590 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
165a0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
165b0 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
165c0 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[i] = sqlite3Bi
165d0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
165e0 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq(.            
165f0 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70      pParse, p, p
16600 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
16610 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  r.            );
16620 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
16640 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
16650 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
16660 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
16670 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
16680 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
16690 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
166a0 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
166b0 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
166c0 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
166d0 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
166e0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
166f0 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
16700 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
16710 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
16720 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
16730 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
16740 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
16750 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
16760 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
16770 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
16780 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
16790 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
167a0 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
167b0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  /.        char a
167c0 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
167d0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
167e0 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
167f0 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  e IN */.        
16800 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
16810 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
16820 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
16830 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
16840 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
16850 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Item;.        in
16860 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20  t r1, r2, r3;.. 
16870 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
16880 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
16890 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20  inity(pLeft);.  
168a0 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
168b0 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
168c0 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
168d0 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
168e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
168f0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
16900 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16910 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
16920 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
16930 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
16940 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
16950 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
16960 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
16970 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
16980 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
16990 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
169a0 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
169b0 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
169c0 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31  >. */.        r1
169d0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
169e0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
169f0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
16a00 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16a10 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
16a20 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69  ( isRowid ) sqli
16a30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16a40 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29   OP_Null, 0, r2)
16a50 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
16a60 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
16a70 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
16a80 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
16a90 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
16aa0 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
16ab0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
16ac0 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a  int iValToIns;..
16ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16ae0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
16af0 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
16b00 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
16b10 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
16b20 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
16b30 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
16b40 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
16b50 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
16b60 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
16b70 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
16b80 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
16b90 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
16ba0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
16bb0 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
16bc0 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
16bd0 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
16be0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
16bf0 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66         if( jmpIf
16c00 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73  Dynamic>=0 && !s
16c10 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
16c20 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
16c30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16c40 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
16c50 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
16c60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
16c70 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
16c80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
16c90 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
16ca0 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
16cb0 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
16cc0 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
16cd0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
16ce0 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
16cf0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
16d00 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
16d10 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
16d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16d30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
16d40 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
16d50 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
16d60 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
16d70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16d80 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
16d90 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
16da0 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
16db0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
16dc0 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16de0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16df0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
16e00 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
16e30 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
16e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  .              V
16e50 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
16e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16e80 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
16e90 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
16ea0 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
16eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16ed0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
16ee0 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
16ef0 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
16f00 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
16f10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
16f20 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
16f30 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
16f40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16f60 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
16f70 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
16f80 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b  ble, r2, r3, 1);
16f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
16fa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16fb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
16fc0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16fd0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
16fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16ff0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17000 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
17010 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65   }.      if( pKe
17020 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
17030 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17040 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
17050 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  oid *)pKeyInfo, 
17060 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
17070 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
17080 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
17090 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
170a0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
170b0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
170c0 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a        /* Case 3:
170d0 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20      (SELECT ... 
170e0 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20  FROM ...).      
170f0 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58  **     or:    EX
17100 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ISTS(SELECT ... 
17110 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20  FROM ...).      
17120 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
17130 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61  a SELECT, genera
17140 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
17150 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c  he values for al
17160 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  l columns of.   
17170 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
17180 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  row into an arra
17190 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61  y of registers a
171a0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e  nd return the in
171b0 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  dex of.      ** 
171c0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
171d0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
171e0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
171f0 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74   an EXISTS, writ
17200 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  e an integer 0 (
17210 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
17220 20 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20   (exists).      
17230 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
17240 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  er and return th
17250 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  at register numb
17260 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
17270 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61     ** In both ca
17280 73 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69  ses, the query i
17290 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
172a0 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79   "LIMIT 1".  Any
172b0 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78   .      ** preex
172c0 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20  isting limit is 
172d0 64 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61  discarded in pla
172e0 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49  ce of the new LI
172f0 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a  MIT 1..      */.
17300 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
17310 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
17320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17330 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
17340 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20  to encode */.   
17350 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
17360 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
17370 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
17380 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c  to deal with SEL
17390 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ECT result */.  
173a0 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20      int nReg;   
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
173d0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
173e0 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73  te */..      tes
173f0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
17400 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
17410 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17420 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
17430 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
17440 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
17450 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78  TK_EXISTS || pEx
17460 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
17470 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
17480 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
17490 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
174a0 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20  Select) );..    
174b0 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
174c0 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
174d0 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f   nReg = pExpr->o
174e0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70  p==TK_SELECT ? p
174f0 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sel->pEList->nEx
17500 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71  pr : 1;.      sq
17510 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
17520 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50  nit(&dest, 0, pP
17530 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20  arse->nMem+1);. 
17540 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
17550 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20  m += nReg;.     
17560 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
17570 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
17580 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
17590 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
175a0 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20     dest.iSdst = 
175b0 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
175c0 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74        dest.nSdst
175d0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20   = nReg;.       
175e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
175f0 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
17600 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
17610 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65  dest.iSDParm+nRe
17620 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  g-1);.        Vd
17630 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
17640 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
17650 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
17660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
17670 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
17680 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
17690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
176a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
176b0 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
176c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
176d0 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
176e0 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
176f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17700 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
17710 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
17720 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
17730 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
17740 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
17750 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  c(pParse->db, TK
17760 5f 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20  _INTEGER,.      
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c              &sql
17790 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
177a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  , 0);.      pSel
177b0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
177c0 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
177d0 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56  gs &= ~SF_MultiV
177e0 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  alue;.      if( 
177f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17800 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73  arse, pSel, &des
17810 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
17820 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
17830 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73        rReg = des
17840 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
17850 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
17860 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
17870 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62  Reduce);.      b
17880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17890 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46  .  if( rHasNullF
178a0 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
178b0 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
178c0 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  (v, pExpr->iTabl
178d0 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29  e, rHasNullFlag)
178e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70  ;.  }..  if( jmp
178f0 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a  IfDynamic>=0 ){.
17900 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
17910 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66  umpHere(v, jmpIf
17920 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20  Dynamic);.  }.  
17930 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
17940 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Pop(pParse);..  
17950 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23  return rReg;.}.#
17960 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
17970 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
17980 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17990 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
179a0 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73  *.** Expr pIn is
179b0 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72   an IN(...) expr
179c0 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e  ession. This fun
179d0 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61  ction checks tha
179e0 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65  t the .** sub-se
179f0 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20  lect on the RHS 
17a00 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72  of the IN() oper
17a10 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d  ator has the sam
17a20 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
17a30 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76  columns as the v
17a40 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
17a50 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53  . Or, if the RHS
17a60 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20   of the IN() is 
17a70 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75  not .** a sub-qu
17a80 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48  ery, that the LH
17a90 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66  S is a vector of
17aa0 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20   size 1..*/.int 
17ab0 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
17ac0 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  IN(Parse *pParse
17ad0 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20  , Expr *pIn){.  
17ae0 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71  int nVector = sq
17af0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
17b00 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b  ize(pIn->pLeft);
17b10 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61  .  if( (pIn->fla
17b20 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
17b30 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56  t) ){.    if( nV
17b40 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53  ector!=pIn->x.pS
17b50 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
17b60 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
17b70 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
17b80 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ror(pParse, pIn-
17b90 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
17ba0 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74  st->nExpr, nVect
17bb0 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  or);.      retur
17bc0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 1;.    }.  }el
17bd0 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d  se if( nVector!=
17be0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
17bf0 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70  VectorErrorMsg(p
17c00 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66  Parse, pIn->pLef
17c10 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  t);.    return 1
17c20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
17c30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
17c40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17c50 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
17c60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
17c70 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
17c80 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
17c90 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
17ca0 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
17cb0 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
17cc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
17cd0 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
17ce0 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76  is a scalar or v
17cf0 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
17d00 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74  .  The .** right
17d10 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
17d20 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
17d30 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61  zero or more sca
17d40 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61  lar values, or a
17d50 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49  .** subquery.  I
17d60 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73  f the RHS is a s
17d70 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d  ubquery, the num
17d80 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
17d90 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61  lumns must.** ma
17da0 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
17db0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
17dc0 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
17dd0 48 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  HS.  If the RHS 
17de0 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20  is.** a list of 
17df0 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20  values, the LHS 
17e00 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72  must be a scalar
17e10 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20  . .**.** The IN 
17e20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65  operator is true
17e30 20 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75   if the LHS valu
17e40 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  e is contained w
17e50 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a  ithin the RHS..*
17e60 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
17e70 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  false if the LHS
17e80 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e   is definitely n
17e90 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ot in the RHS.  
17ea0 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69  The .** result i
17eb0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72  s NULL if the pr
17ec0 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48  esence of the LH
17ed0 53 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e  S in the RHS can
17ee0 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72  not be .** deter
17ef0 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c  mined due to NUL
17f00 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  Ls..**.** This r
17f10 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
17f20 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73   code that jumps
17f30 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
17f40 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
17f50 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
17f60 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
17f70 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
17f80 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
17f90 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
17fa0 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
17fb0 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
17fc0 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
17fd0 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
17fe0 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
17ff0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
18000 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
18010 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20  ..**.** See the 
18020 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72  separate in-oper
18030 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74  ator.md document
18040 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68  ation file in th
18050 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53  e canonical.** S
18060 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65  QLite source tre
18070 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
18080 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
18090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
180a0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
180b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
180c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
180d0 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
180e0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
180f0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
18100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18110 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
18120 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
18130 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
18140 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
18150 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
18160 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
18170 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
18180 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
18190 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
181a0 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
181b0 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
181c0 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
181d0 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
181e0 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
181f0 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
18200 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
18210 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
18220 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
18230 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  of the RHS */.  
18240 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20  int rLhs;       
18250 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
18260 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65  r(s) holding the
18270 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20   LHS values */. 
18280 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20   int rLhsOrig;  
18290 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61         /* LHS va
182a0 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65  lues prior to re
182b0 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61  ordering by aiMa
182c0 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  p[] */.  Vdbe *v
182d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
182e0 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  * Statement unde
182f0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
18300 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d  /.  int *aiMap =
18310 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70   0;       /* Map
18320 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65   from vector fie
18330 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75  ld to index colu
18340 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  mn */.  char *zA
18350 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ff = 0;       /*
18360 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
18370 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73   for comparisons
18380 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f   */.  int nVecto
18390 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  r;          /* S
183a0 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66  ize of vectors f
183b0 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  or this IN opera
183c0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75  tor */.  int iDu
183d0 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  mmy;           /
183e0 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65  * Dummy paramete
183f0 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63  r to exprCodeVec
18400 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20  tor() */.  Expr 
18410 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
18420 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
18430 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
18440 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
18450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f            /* loo
18460 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
18470 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20  nt destStep2;   
18480 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
18490 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73   jump when NULLs
184a0 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20   seen in step 2 
184b0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65  */.  int destSte
184c0 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74  p6 = 0;    /* St
184d0 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20  art of code for 
184e0 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20  Step 6 */.  int 
184f0 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20  addrTruthOp;    
18500 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18510 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65  opcode that dete
18520 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73  rmines the IN is
18530 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64   true */.  int d
18540 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20  estNotNull;     
18550 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
18560 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   a comparison is
18570 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65   not true in ste
18580 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  p 6 */.  int add
18590 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  rTop;          /
185a0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65  * Top of the ste
185b0 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20  p-6 loop */ ..  
185c0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
185d0 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  Left;.  if( sqli
185e0 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70  te3ExprCheckIN(p
185f0 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20  Parse, pExpr) ) 
18600 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d  return;.  zAff =
18610 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
18620 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
18630 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69    nVector = sqli
18640 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
18650 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
18660 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a  .  aiMap = (int*
18670 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
18680 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72  Zero(.      pPar
18690 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a  se->db, nVector*
186a0 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73  (sizeof(int) + s
186b0 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31  izeof(char)) + 1
186c0 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  .  );.  if( pPar
186d0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
186e0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69  iled ) goto sqli
186f0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f  te3ExprCodeIN_oo
18700 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41  m_error;..  /* A
18710 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74  ttempt to comput
18720 65 20 74 68 65 20 52 48 53 2e 20 41 66 74 65 72  e the RHS. After
18730 20 74 68 69 73 20 73 74 65 70 2c 20 69 66 20 61   this step, if a
18740 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
18750 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58  an.  ** IN_INDEX
18760 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
18770 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65  d, the table ope
18780 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72 20 70  ned ith cursor p
18790 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20  Expr->iTable .  
187a0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
187b0 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
187c0 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66 20   up the RHS. If 
187d0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
187e0 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20   returned,.  ** 
187f0 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20  the RHS has not 
18800 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20  yet been coded. 
18810 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
18820 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
18830 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
18840 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64   /* OOM detected
18850 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
18860 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65  outine */.  Vdbe
18870 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
18880 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29  "begin IN expr")
18890 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c  );.  eType = sql
188a0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
188b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20  pParse, pExpr,. 
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188d0 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49              IN_I
188e0 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
188f0 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  | IN_INDEX_NOOP_
18900 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK,.            
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18920 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
18930 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26  stIfNull ? 0 : &
18940 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d  rRhsHasNull, aiM
18950 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ap);..  assert( 
18960 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
18970 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54  nVector==1 || eT
18980 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50  ype==IN_INDEX_EP
18990 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  H.       || eTyp
189a0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
189b0 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d  X_ASC || eType==
189c0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
189d0 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66  ESC .  );.#ifdef
189e0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
189f0 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20  /* Confirm that 
18a00 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73  aiMap[] contains
18a10 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72   nVector integer
18a20 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
18a30 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74  0 and.  ** nVect
18a40 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  or-1. */.  for(i
18a50 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
18a60 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20  ++){.    int j, 
18a70 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74  cnt;.    for(cnt
18a80 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b  =j=0; j<nVector;
18a90 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b   j++) if( aiMap[
18aa0 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20  j]==i ) cnt++;. 
18ab0 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d     assert( cnt==
18ac0 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  1 );.  }.#endif.
18ad0 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
18ae0 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
18af0 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
18b00 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48  ...)". If the LH
18b10 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63  S is a .  ** vec
18b20 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20  tor, then it is 
18b30 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
18b40 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65  ay of nVector re
18b50 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
18b60 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20   .  ** at r1..  
18b70 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  **.  ** sqlite3F
18b80 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67  indInIndex() mig
18b90 68 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65  ht have reordere
18ba0 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  d the fields of 
18bb0 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20  the LHS vector. 
18bc0 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
18bd0 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68  fields are in th
18be0 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
18bf0 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
18c00 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69  x.   The.  ** ai
18c10 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  Map[] array cont
18c20 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ains a mapping f
18c30 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
18c40 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72   LHS field order
18c50 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65   to.  ** the fie
18c60 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61  ld order that ma
18c70 74 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e  tches the RHS in
18c80 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dex..  */.  sqli
18c90 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
18ca0 28 70 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73  (pParse);.  rLhs
18cb0 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56  Orig = exprCodeV
18cc0 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c  ector(pParse, pL
18cd0 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20  eft, &iDummy);. 
18ce0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
18cf0 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d  tor && aiMap[i]=
18d00 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72  =i; i++){} /* Ar
18d10 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f  e LHS fields reo
18d20 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28  rdered? */.  if(
18d30 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20   i==nVector ){. 
18d40 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73     /* LHS fields
18d50 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72   are not reorder
18d60 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ed */.    rLhs =
18d70 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c   rLhsOrig;.  }el
18d80 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20  se{.    /* Need 
18d90 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c  to reorder the L
18da0 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64  HS fields accord
18db0 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a  ing to aiMap */.
18dc0 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74      rLhs = sqlit
18dd0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
18de0 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b  Parse, nVector);
18df0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18e00 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
18e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18e20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
18e30 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72  y, rLhsOrig+i, r
18e40 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29  Lhs+aiMap[i], 0)
18e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18e60 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64  * If sqlite3Find
18e70 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f  InIndex() did no
18e80 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  t find or create
18e90 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
18ea0 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20  s.  ** suitable 
18eb0 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74  for evaluating t
18ec0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
18ed0 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73  then evaluate us
18ee0 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65  ing a.  ** seque
18ef0 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
18f00 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ns..  **.  ** Th
18f10 69 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69  is is step (1) i
18f20 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f  n the in-operato
18f30 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61  r.md optimized a
18f40 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20  lgorithm..  */. 
18f50 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
18f60 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_NOOP ){.   
18f70 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
18f80 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
18f90 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  t;.    CollSeq *
18fa0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
18fb0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
18fc0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
18fd0 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f  ;.    int labelO
18fe0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
18ff0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
19000 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72   int r2, regToFr
19010 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43  ee;.    int regC
19020 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  kNull = 0;.    i
19030 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72  nt ii;.    asser
19040 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
19050 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
19060 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
19070 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d  if( destIfNull!=
19080 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
19090 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d       regCkNull =
190a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
190b0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
190c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
190d0 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
190e0 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65  , rLhs, rLhs, re
190f0 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  gCkNull);.    }.
19100 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
19110 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
19120 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  i++){.      r2 =
19130 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19140 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69  Temp(pParse, pLi
19150 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  st->a[ii].pExpr,
19160 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20   &regToFree);.  
19170 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
19180 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  l && sqlite3Expr
19190 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d  CanBeNull(pList-
191a0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
191b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
191c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
191d0 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75  _BitAnd, regCkNu
191e0 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c  ll, r2, regCkNul
191f0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
19200 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e    if( ii<pList->
19210 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49  nExpr-1 || destI
19220 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
19230 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
19240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
19250 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20  v, OP_Eq, rLhs, 
19260 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20  labelOk, r2,.   
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19280 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
19290 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
192a0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
192b0 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70  verageIf(v, ii<p
192c0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
192d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
192e0 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c  rageIf(v, ii==pL
192f0 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
19300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19310 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
19320 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ff[0]);.      }e
19330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
19340 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d  ert( destIfNull=
19350 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a  =destIfFalse );.
19360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19370 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19380 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66  Ne, rLhs, destIf
19390 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20  False, r2,.     
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
193c0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20  l, P4_COLLSEQ); 
193d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
193e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
193f0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
19400 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45  zAff[0] | SQLITE
19410 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
19420 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
19430 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19440 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46  g(pParse, regToF
19450 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
19460 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b  if( regCkNull ){
19470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19480 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19490 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c  sNull, regCkNull
194a0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56  , destIfNull); V
194b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
194c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
194d0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
194e0 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alse);.    }.   
194f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
19500 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
19510 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOk);.    sqlite
19520 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19530 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c  pParse, regCkNul
19540 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c  l);.    goto sql
19550 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66  ite3ExprCodeIN_f
19560 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20  inished;.  }..  
19570 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b  /* Step 2: Check
19580 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
19590 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  HS contains any 
195a0 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49  NULL columns.  I
195b0 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64  f the.  ** LHS d
195c0 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  oes contain NULL
195d0 73 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  s then the resul
195e0 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
195f0 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a   FALSE or NULL..
19600 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65    ** We will the
19610 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72  n skip the binar
19620 79 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20  y search of the 
19630 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  RHS..  */.  if( 
19640 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
19650 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64  IfFalse ){.    d
19660 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 49  estStep2 = destI
19670 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b  fFalse;.  }else{
19680 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d  .    destStep2 =
19690 20 64 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c   destStep6 = sql
196a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
196b0 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  l(v);.  }.  for(
196c0 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
196d0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
196e0 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
196f0 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45  rFieldSubexpr(pE
19700 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  xpr->pLeft, i);.
19710 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
19720 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20  xprCanBeNull(p) 
19730 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19740 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19750 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c  _IsNull, rLhs+i,
19760 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20   destStep2);.   
19770 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
19780 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  v);.    }.  }.. 
19790 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65   /* Step 3.  The
197a0 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77   LHS is now know
197b0 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
197c0 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79  .  Do the binary
197d0 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20   search.  ** of 
197e0 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68  the RHS using th
197f0 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65  e LHS as a probe
19800 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65  .  If found, the
19810 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20   result is.  ** 
19820 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  true..  */.  if(
19830 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
19840 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a  _ROWID ){.    /*
19850 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
19860 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
19870 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
19880 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c  ree and so we al
19890 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74  so.    ** know t
198a0 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e  hat the RHS is n
198b0 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  on-NULL.  Hence,
198c0 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70   we combine step
198d0 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a  s 3 and 4.    **
198e0 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
198f0 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71  pcode. */.    sq
19900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19910 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
19920 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19930 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68  destIfFalse, rLh
19940 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  s);.    VdbeCove
19950 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
19960 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74  rTruthOp = sqlit
19970 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
19980 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65  OP_Goto);  /* Re
19990 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d  turn True */.  }
199a0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
199b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
199c0 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73  P_Affinity, rLhs
199d0 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41  , nVector, 0, zA
199e0 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  ff, nVector);.  
199f0 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73    if( destIfFals
19a00 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b  e==destIfNull ){
19a10 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  .      /* Combin
19a20 65 20 53 74 65 70 20 33 20 61 6e 64 20 53 74 65  e Step 3 and Ste
19a30 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  p 5 into a singl
19a40 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  e opcode */.    
19a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19a60 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
19a70 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
19a80 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
19a90 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
19ab0 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
19ac0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19ad0 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65       goto sqlite
19ae0 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
19af0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  shed;.    }.    
19b00 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70  /* Ordinary Step
19b10 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65   3, for the case
19b20 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64   where FALSE and
19b30 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e   NULL are distin
19b40 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72  ct */.    addrTr
19b50 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
19b60 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
19b70 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
19b80 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20  >iTable, 0,.    
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
19bc0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19bd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
19be0 70 20 34 2e 20 20 49 66 20 74 68 65 20 52 48 53  p 4.  If the RHS
19bf0 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
19c00 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20  non-NULL and we 
19c10 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a  did not find.  *
19c20 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68  * an match on th
19c30 65 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20  e search above, 
19c40 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
19c50 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20  must be FALSE.. 
19c60 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61   */.  if( rRhsHa
19c70 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72  sNull && nVector
19c80 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
19c90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19ca0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73  OP_NotNull, rRhs
19cb0 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46  HasNull, destIfF
19cc0 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43  alse);.    VdbeC
19cd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
19ce0 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49  .  /* Step 5.  I
19cf0 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  f we do not care
19d00 20 61 62 6f 75 74 20 74 68 65 20 64 69 66 66 65   about the diffe
19d10 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55  rence between NU
19d20 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53  LL and.  ** FALS
19d30 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  E, then just ret
19d40 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f  urn false. .  */
19d50 0a 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c  .  if( destIfFal
19d60 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29  se==destIfNull )
19d70 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
19d80 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
19d90 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20  ;..  /* Step 6: 
19da0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77  Loop through row
19db0 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43  s of the RHS.  C
19dc0 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77 20  ompare each row 
19dd0 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a  to the LHS..  **
19de0 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73   If any comparis
19df0 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  on is NULL, then
19e00 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
19e10 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a  ULL.  If all.  *
19e20 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72  * comparisons ar
19e30 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65  e FALSE then the
19e40 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73   final result is
19e50 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a   FALSE..  **.  *
19e60 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c  * For a scalar L
19e70 48 53 2c 20 69 74 20 69 73 20 73 75 66 66 69 63  HS, it is suffic
19e80 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75  ient to check ju
19e90 73 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  st the first row
19ea0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53  .  ** of the RHS
19eb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
19ec0 74 53 74 65 70 36 20 29 20 73 71 6c 69 74 65 33  tStep6 ) sqlite3
19ed0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
19ee0 28 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a  (v, destStep6);.
19ef0 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
19f00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19f10 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70   OP_Rewind, pExp
19f20 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
19f30 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43  fFalse);.  VdbeC
19f40 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
19f50 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
19f60 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d     destNotNull =
19f70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19f80 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73  Label(v);.  }els
19f90 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56  e{.    /* For nV
19fa0 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e  ector==1, combin
19fb0 65 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20  e steps 6 and 7 
19fc0 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  by immediately r
19fd0 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eturning.    ** 
19fe0 46 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72  FALSE if the fir
19ff0 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  st comparison is
1a000 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   not NULL */.   
1a010 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64   destNotNull = d
1a020 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a  estIfFalse;.  }.
1a030 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
1a040 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
1a050 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c  Expr *p;.    Col
1a060 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
1a070 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65   int r3 = sqlite
1a080 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1a090 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  se);.    p = sql
1a0a0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
1a0b0 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
1a0c0 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
1a0d0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1a0e0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
1a0f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a100 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1a110 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1a120 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69  i, r3);.    sqli
1a130 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a140 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20   OP_Ne, rLhs+i, 
1a150 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c  destNotNull, r3,
1a160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a170 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
1a180 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1a190 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1a1a0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1a1b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1a1c0 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20  (pParse, r3);.  
1a1d0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1a1e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1a1f0 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  , 0, destIfNull)
1a200 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e  ;.  if( nVector>
1a210 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1a220 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1a230 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29  (v, destNotNull)
1a240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a250 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
1a260 78 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  xt, pExpr->iTabl
1a270 65 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  e, addrTop+1);. 
1a280 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1a290 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70  v);..    /* Step
1a2a0 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68   7:  If we reach
1a2b0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
1a2c0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65  know that the re
1a2d0 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  sult must.    **
1a2e0 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20   be false. */.  
1a2f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a300 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1a310 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
1a320 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73  .  }..  /* Jumps
1a330 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74   here in order t
1a340 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a  o return true. *
1a350 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
1a360 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
1a370 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65  ruthOp);..sqlite
1a380 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1a390 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73  shed:.  if( rLhs
1a3a0 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c  !=rLhsOrig ) sql
1a3b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a3c0 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29  eg(pParse, rLhs)
1a3d0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1a3e0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1a3f0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1a400 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
1a410 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43  ));.sqlite3ExprC
1a420 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a  odeIN_oom_error:
1a430 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1a440 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d  (pParse->db, aiM
1a450 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ap);.  sqlite3Db
1a460 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1a470 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66   zAff);.}.#endif
1a480 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1a490 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
1a4a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a4b0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1a4c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1a4d0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1a4e0 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
1a4f0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
1a500 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
1a510 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
1a520 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
1a530 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
1a540 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
1a550 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
1a560 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
1a570 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
1a580 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
1a590 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
1a5a0 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
1a5b0 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
1a5c0 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
1a5d0 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
1a5e0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1a5f0 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
1a600 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
1a610 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
1a620 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
1a630 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
1a640 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
1a650 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
1a660 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
1a670 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1a680 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
1a690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
1a6a0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
1a6b0 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
1a6c0 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
1a6d0 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
1a6e0 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
1a6f0 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
1a700 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a710 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
1a720 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
1a730 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
1a740 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
1a750 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
1a760 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
1a770 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
1a780 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
1a790 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
1a7a0 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
1a7b0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
1a7c0 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
1a7d0 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
1a7e0 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
1a7f0 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
1a800 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
1a810 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
1a820 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1a830 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
1a840 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
1a850 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1a860 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
1a870 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
1a880 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
1a890 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
1a8a0 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
1a8b0 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
1a8c0 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
1a8d0 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
1a8e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a8f0 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
1a900 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a910 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
1a920 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
1a930 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
1a940 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
1a950 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
1a960 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65     c = sqlite3De
1a970 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
1a980 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
1a990 63 3d 3d 31 20 7c 7c 20 28 63 3d 3d 32 20 26 26  c==1 || (c==2 &&
1a9a0 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 6e   !negFlag) || (n
1a9b0 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d  egFlag && value=
1a9c0 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29  =SMALLEST_INT64)
1a9d0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1a9e0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1a9f0 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
1aa00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1aa10 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
1aa20 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
1aa30 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
1aa40 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
1aa50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1aa60 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
1aa70 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1aa80 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
1aa90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1aaa0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1aab0 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
1aac0 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25  ral too big: %s%
1aad0 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a  s", negFlag?"-":
1aae0 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  "",z);.      }el
1aaf0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
1ab00 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
1ab10 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
1ab20 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
1ab30 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1ab40 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  e{.      if( neg
1ab50 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
1ab60 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==2 ? SMALLEST_
1ab70 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
1ab80 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1ab90 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1aba0 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
1abb0 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
1abc0 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ue, P4_INT64);. 
1abd0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1abe0 2a 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63  * Erase column-c
1abf0 61 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65  ache entry numbe
1ac00 72 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r i.*/.static vo
1ac10 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
1ac20 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
1ac30 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20  , int i){.  if( 
1ac40 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1ac50 65 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a  e[i].tempReg ){.
1ac60 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1ac70 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1ac80 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1ac90 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50  Reg) ){.      pP
1aca0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1acb0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1acc0 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  +] = pParse->aCo
1acd0 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
1ace0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
1acf0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b  se->nColCache--;
1ad00 0a 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d  .  if( i<pParse-
1ad10 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20  >nColCache ){.  
1ad20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61    pParse->aColCa
1ad30 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  che[i] = pParse-
1ad40 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73  >aColCache[pPars
1ad50 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20  e->nColCache];. 
1ad60 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   }.}.../*.** Rec
1ad70 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
1ad80 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
1ad90 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
1ada0 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
1adb0 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
1adc0 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
1add0 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
1ade0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1adf0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
1ae00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1ae10 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
1ae20 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
1ae30 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
1ae40 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
1ae50 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1ae60 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e  che *p;..  /* Un
1ae70 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61  less an error ha
1ae80 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69  s occurred, regi
1ae90 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
1aea0 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
1aeb0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
1aec0 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  Reg>0 || pParse-
1aed0 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
1aee0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1aef0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  d );.  assert( i
1af00 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
1af10 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
1af20 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
1af30 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
1af40 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
1af50 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
1af60 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1af70 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
1af80 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
1af90 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
1afa0 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
1afb0 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
1afc0 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
1afd0 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
1afe0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1aff0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70  e..  */.  if( Op
1b000 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1b010 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
1b020 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1b030 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  e) ) return;..  
1b040 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
1b050 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
1b060 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
1b070 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
1b080 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b090 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
1b0a0 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
1b0b0 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
1b0c0 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
1b0d0 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
1b0e0 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
1b0f0 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
1b100 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
1b110 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
1b120 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1b130 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1b140 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1b150 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , p++){.    asse
1b160 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69  rt( p->iTable!=i
1b170 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
1b180 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
1b190 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1b1a0 68 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65  he cache is alre
1b1b0 61 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65  ady full, delete
1b1c0 20 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e   the least recen
1b1d0 74 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a  tly used entry *
1b1e0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
1b1f0 6e 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54  nColCache>=SQLIT
1b200 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a  E_N_COLCACHE ){.
1b210 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37      minLru = 0x7
1b220 66 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78  fffffff;.    idx
1b230 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f  Lru = -1;.    fo
1b240 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1b250 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
1b260 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
1b270 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1b280 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
1b290 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Lru ){.        i
1b2a0 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
1b2b0 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
1b2c0 72 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ru;.      }.    
1b2d0 7d 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  }.    p = &pPars
1b2e0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
1b2f0 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Lru];.  }else{. 
1b300 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
1b310 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1b320 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a  ->nColCache++];.
1b330 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
1b340 65 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74  e new entry to t
1b350 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61  he end of the ca
1b360 63 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76  che */.  p->iLev
1b370 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
1b380 63 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69  cheLevel;.  p->i
1b390 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
1b3a0 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
1b3b0 6c 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  l;.  p->iReg = i
1b3c0 52 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65  Reg;.  p->tempRe
1b3d0 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20  g = 0;.  p->lru 
1b3e0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1b3f0 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cnt++;.}../*.** 
1b400 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
1b410 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
1b420 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
1b430 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
1b440 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
1b450 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
1b460 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
1b470 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1b480 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b490 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
1b4a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1b4b0 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
1b4c0 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
1b4d0 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73    while( i<pPars
1b4e0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a  e->nColCache ){.
1b4f0 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
1b500 61 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73  ache *p = &pPars
1b510 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b  e->aColCache[i];
1b520 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1b530 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69   >= iReg && p->i
1b540 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20  Reg < iReg+nReg 
1b550 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
1b560 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
1b570 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   i);.    }else{.
1b580 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
1b590 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1b5a0 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
1b5b0 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
1b5c0 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
1b5d0 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
1b5e0 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
1b5f0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
1b600 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
1b610 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
1b620 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
1b630 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
1b640 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b650 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
1b660 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
1b670 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1b680 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l++;.#ifdef SQLI
1b690 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1b6a0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1b6b0 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1b6c0 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1b6d0 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20  printf("PUSH to 
1b6e0 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
1b6f0 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
1b700 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
1b710 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
1b720 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
1b730 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
1b740 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
1b750 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
1b760 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43  ous sqlite3ExprC
1b770 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69  achePush operati
1b780 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
1b790 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20  rds, restore.** 
1b7a0 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
1b7b0 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1b7c0 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20   prior the most 
1b7d0 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a  recent Push..*/.
1b7e0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1b7f0 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
1b800 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
1b810 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1b820 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1b830 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72  vel>=1 );.  pPar
1b840 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d  se->iCacheLevel-
1b850 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  -;.#ifdef SQLITE
1b860 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1b870 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1b880 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1b890 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1b8a0 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64  intf("POP  to %d
1b8b0 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
1b8c0 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
1b8d0 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69  endif.  while( i
1b8e0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1b8f0 68 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  he ){.    if( pP
1b900 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1b910 69 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  i].iLevel>pParse
1b920 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
1b930 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
1b940 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69  yClear(pParse, i
1b950 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b960 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
1b970 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1b980 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
1b990 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
1b9a0 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
1b9b0 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
1b9c0 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
1b9d0 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
1b9e0 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
1b9f0 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
1ba00 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
1ba10 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
1ba20 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
1ba30 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
1ba40 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
1ba50 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
1ba60 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1ba70 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
1ba80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1ba90 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
1baa0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1bab0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1bac0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1bad0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1bae0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1baf0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1bb00 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
1bb10 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
1bb20 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
1bb30 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
1bb40 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1bb50 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73   load into regis
1bb60 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c  ter regOut a val
1bb70 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70  ue that is.** ap
1bb80 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
1bb90 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c  e iIdxCol-th col
1bba0 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
1bbb0 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1bbc0 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e  e3ExprCodeLoadIn
1bbd0 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  dexColumn(.  Par
1bbe0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20  se *pParse,  /* 
1bbf0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1bc00 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1bc10 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20  pIdx,    /* The 
1bc20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75  index whose colu
1bc30 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64  mn is to be load
1bc40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
1bc50 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
1bc60 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  r pointing to a 
1bc70 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69  table row */.  i
1bc80 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f  nt iIdxCol,    /
1bc90 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * The column of 
1bca0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
1bcb0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1bcc0 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53  regOut      /* S
1bcd0 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63  tore the index c
1bce0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74  olumn value in t
1bcf0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1bd00 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c  ){.  i16 iTabCol
1bd10 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1bd20 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66  n[iIdxCol];.  if
1bd30 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58  ( iTabCol==XN_EX
1bd40 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PR ){.    assert
1bd50 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
1bd60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1bd70 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1bd80 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b  nExpr>iIdxCol );
1bd90 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
1bda0 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b  lfTab = iTabCur;
1bdb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1bdc0 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
1bdd0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1bde0 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
1bdf0 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
1be00 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1be10 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1be20 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d  nOfTable(pParse-
1be30 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54  >pVdbe, pIdx->pT
1be40 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20  able, iTabCur,. 
1be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be70 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f     iTabCol, regO
1be80 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
1be90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1bea0 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
1beb0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c  alue of the iCol
1bec0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  -th column of a 
1bed0 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
1bee0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1bef0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a  tColumnOfTable(.
1bf00 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
1bf10 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
1bf20 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1bf30 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1bf40 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  b,    /* The tab
1bf50 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
1bf60 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  e value */.  int
1bf70 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
1bf80 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  The table cursor
1bf90 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72  .  Or the PK cur
1bfa0 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20  sor for WITHOUT 
1bfb0 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69  ROWID */.  int i
1bfc0 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e  Col,       /* In
1bfd0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
1bfe0 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a  n to extract */.
1bff0 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
1c000 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1c010 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73   value into this
1c020 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
1c030 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
1c040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c050 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1c060 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43  umn, iTabCur, iC
1c070 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20  ol, regOut);.   
1c080 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
1c090 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
1c0a0 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  l==pTab->iPKey )
1c0b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c0c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1c0d0 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65  wid, iTabCur, re
1c0e0 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
1c0f0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
1c100 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
1c110 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
1c120 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78  olumn;.    int x
1c130 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28   = iCol;.    if(
1c140 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
1c150 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
1c160 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20  Tab) ){.      x 
1c170 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
1c180 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72  fIndex(sqlite3Pr
1c190 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
1c1a0 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  ab), iCol);.    
1c1b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1c1c0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
1c1d0 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75  TabCur, x, regOu
1c1e0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  t);.  }.  if( iC
1c1f0 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ol>=0 ){.    sql
1c200 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c  ite3ColumnDefaul
1c210 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c  t(v, pTab, iCol,
1c220 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
1c230 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c240 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1c250 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
1c260 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
1c270 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
1c280 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f  and store the co
1c290 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20  lumn value in a 
1c2a0 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a  register. .**.**
1c2b0 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   An effort is ma
1c2c0 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
1c2d0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1c2e0 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20  register iReg.  
1c2f0 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67  This.** is not g
1c300 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65  aranteeed for Ge
1c310 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20  tColumn() - the 
1c320 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74  result can be st
1c330 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72  ored in.** any r
1c340 65 67 69 73 74 65 72 2e 20 20 42 75 74 20 74 68  egister.  But th
1c350 65 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72  e result is guar
1c360 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69  anteed to land i
1c370 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 0a  n register iReg.
1c380 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e  ** for GetColumn
1c390 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ToReg()..**.** T
1c3a0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1c3b0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70  open cursor to p
1c3c0 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68  Tab in iTable wh
1c3d0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
1c3e0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49  ** is called.  I
1c3f0 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
1c400 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
1c410 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73  ed that extracts
1c420 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69   the rowid..*/.i
1c430 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1c440 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50  deGetColumn(.  P
1c450 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1c460 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1c470 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1c480 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
1c490 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
1c4a0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1c4b0 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
1c4c0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
1c4d0 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
1c4e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1c4f0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1c500 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1c510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1c520 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1c530 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1c540 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20  nt iReg,        
1c550 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
1c560 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35   here */.  u8 p5
1c570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c580 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43  5 value for OP_C
1c590 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f  olumn + FLAGS */
1c5a0 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
1c5b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1c5c0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1c5d0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
1c5e0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1c5f0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1c600 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1c610 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
1c620 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c      if( p->iTabl
1c630 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e  e==iTable && p->
1c640 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  iColumn==iColumn
1c650 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   ){.      p->lru
1c660 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
1c670 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  eCnt++;.      sq
1c680 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
1c690 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  nRegister(pParse
1c6a0 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20  , p->iReg);.    
1c6b0 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67    return p->iReg
1c6c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  ;.    }.  }  .  
1c6d0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
1c6e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c6f0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1c700 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
1c710 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1c720 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
1c730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1c740 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
1c750 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73   }else{   .    s
1c760 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
1c770 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61  tore(pParse, iTa
1c780 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
1c790 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eg);.  }.  retur
1c7a0 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73  n iReg;.}.void s
1c7b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1c7c0 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20  tColumnToReg(.  
1c7d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c7e0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
1c7f0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
1c800 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
1c810 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
1c820 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1c830 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
1c840 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
1c850 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
1c860 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1c870 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
1c880 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1c890 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
1c8a0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1c8b0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
1c8c0 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
1c8d0 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
1c8e0 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
1c8f0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45  nt r1 = sqlite3E
1c900 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1c910 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
1c920 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20  Column, iTable, 
1c930 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  iReg, 0);.  if( 
1c940 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74  r1!=iReg ) sqlit
1c950 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
1c960 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
1c970 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b  Copy, r1, iReg);
1c980 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  .}.../*.** Clear
1c990 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
1c9a0 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f  e entries..*/.vo
1c9b0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1c9c0 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a  cheClear(Parse *
1c9d0 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
1c9e0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1c9f0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1ca00 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1ca10 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1ca20 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1ca30 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b  intf("CLEAR\n");
1ca40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
1ca50 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
1ca60 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29  >nColCache; i++)
1ca70 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
1ca80 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74  ->aColCache[i].t
1ca90 65 6d 70 52 65 67 0a 20 20 20 20 20 26 26 20 70  empReg.     && p
1caa0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
1cab0 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
1cac0 2d 3e 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20  ->aTempReg).    
1cad0 29 7b 0a 20 20 20 20 20 20 20 70 50 61 72 73 65  ){.       pParse
1cae0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
1caf0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
1cb00 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1cb10 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
1cb20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
1cb30 6e 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d  nColCache = 0;.}
1cb40 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
1cb50 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
1cb60 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
1cb70 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
1cb80 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
1cb90 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
1cba0 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
1cbb0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1cbc0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1cbd0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1cbe0 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
1cbf0 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74  iCount){.  sqlit
1cc00 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1cc10 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74  e(pParse, iStart
1cc20 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a  , iCount);.}../*
1cc30 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1cc40 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
1cc50 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
1cc60 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
1cc70 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
1cc80 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
1cc90 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d  . Keep the colum
1cca0 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61  n cache up-to-da
1ccb0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
1ccc0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
1ccd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1cce0 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
1ccf0 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
1cd00 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69  assert( iFrom>=i
1cd10 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d  To+nReg || iFrom
1cd20 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20  +nReg<=iTo );.  
1cd30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cd40 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
1cd50 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
1cd60 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73   iTo, nReg);.  s
1cd70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1cd80 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46  emove(pParse, iF
1cd90 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23  rom, nReg);.}..#
1cda0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1cdb0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1cdc0 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
1cdd0 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
1cde0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
1cdf0 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
1ce00 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
1ce10 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
1ce20 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
1ce30 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
1ce40 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
1ce50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1ce60 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ed within assert
1ce70 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
1ce80 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a  ) macros only.**
1ce90 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70   and does not ap
1cea0 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  pear in a normal
1ceb0 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
1cec0 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
1ced0 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
1cee0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
1cef0 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
1cf00 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
1cf10 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
1cf20 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1cf30 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
1cf40 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1cf50 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1cf60 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
1cf70 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
1cf80 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
1cf90 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f  turn 1;    /*NO_
1cfa0 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  TEST*/.  }.  ret
1cfb0 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1cfc0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1cfd0 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  || SQLITE_COVERA
1cfe0 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a  GE_TEST */.../*.
1cff0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61  ** Convert a sca
1d000 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  lar expression n
1d010 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49  ode to a TK_REGI
1d020 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67  STER referencing
1d030 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52 65  .** register iRe
1d040 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  g.  The caller m
1d050 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
1d060 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e  iReg already con
1d070 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72  tains.** the cor
1d080 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1d090 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
1d0a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1d0b0 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70  prToRegister(Exp
1d0c0 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b  r *p, int iReg){
1d0d0 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
1d0e0 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
1d0f0 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
1d100 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
1d110 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
1d120 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
1d130 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65  ../*.** Evaluate
1d140 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28   an expression (
1d150 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
1d160 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  or a scalar expr
1d170 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72  ession) and stor
1d180 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
1d190 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74  in continguous t
1d1a0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1d1b0 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  rs.  Return the 
1d1c0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1d1d0 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75  first register u
1d1e0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1d1f0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49   result..**.** I
1d200 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1d210 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
1d220 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63  s a temporary sc
1d230 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20  alar, then also 
1d240 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65  write.** that re
1d250 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e  gister number in
1d260 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20  to *piFreeable. 
1d270 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
1d280 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
1d290 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  .** is not a tem
1d2a0 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65  porary or if the
1d2b0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1d2c0 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46   vector set *piF
1d2d0 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e  reeable.** to 0.
1d2e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1d2f0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61  xprCodeVector(Pa
1d300 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1d310 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65  r *p, int *piFre
1d320 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  eable){.  int iR
1d330 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65  esult;.  int nRe
1d340 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1d350 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b  prVectorSize(p);
1d360 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d  .  if( nResult==
1d370 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74  1 ){.    iResult
1d380 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d390 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1d3a0 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20  , piFreeable);. 
1d3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46   }else{.    *piF
1d3c0 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  reeable = 0;.   
1d3d0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
1d3e0 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c  ELECT ){.#if SQL
1d3f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1d400 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  Y.      iResult 
1d410 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  = 0;.#else.     
1d420 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1d430 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1d440 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29  pParse, p, 0, 0)
1d450 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1d460 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1d470 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1d480 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1d490 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1d4a0 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a  Mem += nResult;.
1d4b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1d4c0 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a  <nResult; i++){.
1d4d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1d4e0 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
1d4f0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70  e(pParse, p->x.p
1d500 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1d510 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20  , i+iResult);.  
1d520 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d530 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74    return iResult
1d540 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
1d550 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
1d560 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
1d570 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1d580 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
1d590 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
1d5a0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1d5b0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
1d5c0 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
1d5d0 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
1d5e0 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
1d5f0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
1d600 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
1d610 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
1d620 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
1d630 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
1d640 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
1d650 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
1d660 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
1d670 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
1d680 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
1d690 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1d6a0 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
1d6b0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
1d6c0 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
1d6d0 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
1d6e0 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
1d6f0 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
1d700 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
1d710 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1d720 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
1d730 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1d740 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1d750 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1d760 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
1d770 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
1d780 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1d790 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1d7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d7b0 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
1d7c0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
1d7d0 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
1d7e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
1d7f0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1d800 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
1d810 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
1d820 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
1d830 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
1d840 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1d850 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
1d860 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
1d870 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1d880 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1d890 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1d8a0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20    int r1, r2;   
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1d8c0 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
1d8d0 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70  numbers */.  Exp
1d8e0 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20  r tempX;        
1d8f0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
1d900 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ary expression n
1d910 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20  ode */.  int p5 
1d920 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1d930 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
1d940 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
1d950 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
1d960 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1d970 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1d980 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1d990 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  turn 0;.  }..  i
1d9a0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
1d9b0 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
1d9c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
1d9d0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1d9e0 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
1d9f0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
1da00 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
1da10 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
1da20 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1da30 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
1da40 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1da50 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
1da60 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
1da70 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
1da80 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
1da90 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
1daa0 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
1dab0 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
1dac0 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d   return pCol->iM
1dad0 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  em;.      }else 
1dae0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
1daf0 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
1db00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1db10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1db20 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
1db30 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c  >sortingIdxPTab,
1db40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1db60 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1db70 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1db80 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1db90 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1dba0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1dbb0 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1dbc0 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1dbd0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1dbe0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1dbf0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1dc00 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1dc10 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
1dc20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1dc30 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
1dc40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1dc50 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1dc60 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1dc70 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1dc80 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1dc90 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1dca0 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1dcb0 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  n + pParse->ckBa
1dcc0 73 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  se;.        }els
1dcd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1dce0 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73  Coding an expres
1dcf0 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72  sion that is par
1dd00 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68  t of an index wh
1dd10 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ere column names
1dd20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
1dd30 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65 72   the index refer
1dd40 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f   to the table to
1dd50 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78   which the index
1dd60 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20   belongs */.    
1dd70 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61        iTab = pPa
1dd80 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20  rse->iSelfTab;. 
1dd90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dda0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1ddb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1ddc0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
1ddd0 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20  Expr->pTab,.    
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1de00 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  ->iColumn, iTab,
1de10 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1de40 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  p2);.    }.    c
1de50 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1de60 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1de70 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1de80 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1de90 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1dea0 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1deb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1dec0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1ded0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
1dee0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1def0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1df00 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1df10 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f  lue) );.      co
1df20 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d  deReal(v, pExpr-
1df30 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61  >u.zToken, 0, ta
1df40 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1df50 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1df60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1df70 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1df80 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1df90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1dfa0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1dfb0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1dfc0 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1dfd0 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1dfe0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1dff0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e000 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1e010 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
1e020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e030 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1e040 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1e050 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e060 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1e070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1e080 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1e090 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1e0a0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1e0b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1e0c0 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1e0d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e0e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e0f0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1e100 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1e110 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e120 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1e130 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e140 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1e150 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e160 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1e170 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1e180 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1e190 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1e1a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1e1b0 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1e1c0 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1e1d0 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1e1e0 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1e1f0 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1e200 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1e210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e220 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1e230 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1e240 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1e250 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e260 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
1e270 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1e280 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
1e290 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e2a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e2b0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1e2c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e2d0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e2e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1e2f0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e300 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
1e310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e320 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp2(v, OP_Vari
1e330 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
1e340 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1e350 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1e360 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29  u.zToken[1]!=0 )
1e370 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1e380 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1e390 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28  3VListNumToName(
1e3a0 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
1e3b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1e3c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e3d0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e3e0 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63  [0]=='?' || strc
1e3f0 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
1e400 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20  en, z)==0 );.   
1e410 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c       pParse->pVL
1e420 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49  ist[0] = 0; /* I
1e430 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61  ndicate VList ma
1e440 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65  y no longer be e
1e450 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20  nlarged */.     
1e460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
1e470 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a  pendP4(v, (char*
1e480 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  )z, P4_STATIC);.
1e490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1e4a0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e4b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
1e4c0 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
1e4d0 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1e4e0 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Table;.    }.#if
1e4f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e500 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
1e510 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
1e520 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
1e530 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
1e540 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
1e550 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65  n) */.      inRe
1e560 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1e570 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1e580 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e590 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1e5a0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1e5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e5c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e5d0 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
1e5e0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e5f0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1e600 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1e610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e620 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74  p2(v, OP_Cast, t
1e630 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e650 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
1e660 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
1e670 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74  en, 0));.      t
1e680 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
1e690 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
1e6a0 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
1e6b0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e6c0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1e6d0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1e6e0 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
1e6f0 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
1e700 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1e710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1e720 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1e730 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1e740 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20  ISNOT:.      op 
1e750 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
1e760 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
1e770 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45       p5 = SQLITE
1e780 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
1e790 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a  * fall-through *
1e7a0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1e7b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1e7c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1e7d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1e7e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1e7f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1e800 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1e810 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1e820 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Left;.      if( 
1e830 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
1e840 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20  tor(pLeft) ){.  
1e850 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72        codeVector
1e860 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1e870 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f  pExpr, target, o
1e880 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65  p, p5);.      }e
1e890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1e8a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e8b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
1e8c0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1e8d0 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1e8e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e8f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e900 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1e910 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  e2);.        cod
1e920 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1e930 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70   pLeft, pExpr->p
1e940 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1e950 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
1e960 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
1e970 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20  REP2 | p5);.    
1e980 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
1e990 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
1e9a0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
1e9b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e9c0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
1e9d0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1e9e0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1e9f0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1ea00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ea10 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1ea20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1ea30 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1ea40 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1ea50 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ea60 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1ea70 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
1ea80 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
1ea90 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
1eaa0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1eab0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
1eac0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1ead0 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1eae0 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1eaf0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1eb00 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1eb10 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1eb20 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1eb30 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1eb40 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1eb50 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1eb60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1eb70 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1eb80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1eb90 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1eba0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1ebb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ebc0 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
1ebd0 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
1ebe0 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
1ebf0 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
1ec00 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1ec10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
1ec20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1ec30 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
1ec40 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
1ec50 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
1ec60 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
1ec70 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
1ec80 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
1ec90 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
1eca0 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
1ecb0 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20  =OP_And );      
1ecc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ecd0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
1ece0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
1ecf0 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20  R==OP_Or );     
1ed00 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1ed10 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
1ed20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ed30 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
1ed40 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1ed50 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53  ase( op==TK_PLUS
1ed60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ed70 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
1ed80 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74  ubtract );     t
1ed90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1eda0 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61  MINUS );.      a
1edb0 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
1edc0 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20  P_Remainder );  
1edd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ede0 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
1edf0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1ee00 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
1ee10 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1ee20 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
1ee30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ee40 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
1ee50 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73  Or );        tes
1ee60 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1ee70 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TOR );.      ass
1ee80 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
1ee90 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20  P_Divide );     
1eea0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1eeb0 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
1eec0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
1eed0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
1eee0 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1eef0 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29   op==TK_LSHIFT )
1ef00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ef10 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
1ef20 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73  iftRight );  tes
1ef30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
1ef40 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1ef50 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
1ef60 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20  =OP_Concat );   
1ef70 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ef80 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
1ef90 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1efa0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1efb0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1efc0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1efd0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1efe0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eff0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1f000 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1f010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f020 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1f030 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1f040 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f050 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1f060 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f070 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1f080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f090 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
1f0a0 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
1f0b0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1f0c0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1f0d0 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
1f0e0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
1f0f0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
1f100 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1f110 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
1f120 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
1f130 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f140 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65  n target;.#ifnde
1f150 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1f160 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1f170 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
1f180 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
1f190 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1f1a0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1f1b0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1f1c0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1f1d0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1f1e0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
1f1f0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1f200 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1f210 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  et;.#endif.     
1f220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f230 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e  tempX.op = TK_IN
1f240 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74  TEGER;.        t
1f250 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f  empX.flags = EP_
1f260 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65  IntValue|EP_Toke
1f270 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74  nOnly;.        t
1f280 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20  empX.u.iValue = 
1f290 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  0;.        r1 = 
1f2a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f2b0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d  emp(pParse, &tem
1f2c0 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
1f2d0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
1f2e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f2f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f300 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
1f310 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f320 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1f330 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
1f340 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
1f350 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f360 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1f370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1f380 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f390 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
1f3a0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1f3b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f3c0 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
1f3d0 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
1f3e0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
1f3f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f400 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
1f410 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
1f420 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1f430 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1f440 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f450 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f460 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f470 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1f480 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f490 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f4a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1f4b0 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
1f4c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f4d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1f4e0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
1f4f0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
1f500 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
1f510 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
1f520 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
1f530 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1f540 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1f550 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f560 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
1f570 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
1f580 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
1f590 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f5a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f5b0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
1f5c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
1f5d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f5e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f5f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f600 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1f610 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f620 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
1f630 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1f640 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
1f650 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1f660 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1f670 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
1f680 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f690 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
1f6a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f6b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f6c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72  _Integer, 0, tar
1f6d0 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
1f6e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1f6f0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
1f700 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f710 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1f720 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
1f730 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
1f740 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
1f750 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
1f760 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
1f770 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1f780 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1f790 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1f7a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1f7b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1f7c0 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
1f7d0 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70  ate: %s()", pExp
1f7e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1f7f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f800 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d     return pInfo-
1f810 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
1f820 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
1f830 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1f840 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f850 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1f860 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
1f870 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
1f880 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
1f890 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1f8a0 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
1f8b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f8c0 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
1f8d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1f8e0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
1f8f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1f900 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
1f910 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
1f920 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1f930 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
1f940 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1f950 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73  /.      u32 cons
1f960 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
1f970 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
1f980 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
1f990 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
1f9a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f9c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1f9d0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  /.      sqlite3 
1f9e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1f9f0 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
1fa00 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1fa10 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
1fa20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
1fa30 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
1fa40 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
1fa50 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
1fa60 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1fa70 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
1fa80 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1fa90 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 43   */..      if( C
1faa0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
1fab0 72 73 65 29 20 26 26 20 73 71 6c 69 74 65 33 45  rse) && sqlite3E
1fac0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
1fad0 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  Join(pExpr) ){. 
1fae0 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75         /* SQL fu
1faf0 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65  nctions can be e
1fb00 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79  xpensive. So try
1fb10 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e   to move constan
1fb20 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  t functions.    
1fb30 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68      ** out of th
1fb40 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76  e inner loop, ev
1fb50 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
1fb60 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70   an extra OP_Cop
1fb70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  y. */.        re
1fb80 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
1fb90 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1fba0 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20  e, pExpr, -1);. 
1fbb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1fbc0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1fbd0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1fbe0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1fbf0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1fc00 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1fc10 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
1fc20 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
1fc30 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1fc40 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
1fc50 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1fc60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
1fc70 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
1fc80 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
1fc90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1fca0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1fcb0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1fcc0 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
1fcd0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
1fce0 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
1fcf0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
1fd00 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61  ion(db, zId, nFa
1fd10 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66  rg, enc, 0);.#if
1fd20 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1fd30 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55  E_UNKNOWN_SQL_FU
1fd40 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28  NCTION.      if(
1fd50 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72   pDef==0 && pPar
1fd60 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
1fd70 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
1fd80 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1fd90 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c  n(db, "unknown",
1fda0 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
1fdb0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1fdc0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
1fdd0 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61  0 || pDef->xFina
1fde0 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
1fdf0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1fe00 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
1fe10 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73  own function: %s
1fe20 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  ()", zId);.     
1fe30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1fe40 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65  }..      /* Atte
1fe50 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70  mpt a direct imp
1fe60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1fe70 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c  he built-in COAL
1fe80 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20  ESCE() and.     
1fe90 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e   ** IFNULL() fun
1fea0 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76  ctions.  This av
1feb0 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79  oids unnecessary
1fec0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20   evaluation of. 
1fed0 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74       ** argument
1fee0 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  s past the first
1fef0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65   non-NULL argume
1ff00 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
1ff10 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
1ff20 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
1ff30 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
1ff40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
1ff50 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
1ff60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1ff70 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  v);.        asse
1ff80 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a  rt( nFarg>=2 );.
1ff90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ffa0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1ffb0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
1ffc0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
1ffd0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
1ffe0 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
1fff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20000 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
20010 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65  tNull, target, e
20020 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
20030 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
20040 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
20050 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20060 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
20070 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20   target, 1);.   
20080 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20090 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
200a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
200b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
200c0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
200d0 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  i].pExpr, target
200e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
200f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
20100 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20110 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
20120 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
20130 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73  bel(v, endCoales
20140 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ce);.        bre
20150 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
20160 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45     /* The UNLIKE
20170 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  LY() function is
20180 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72   a no-op.  The r
20190 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c  esult is the val
201a0 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ue.      ** of t
201b0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
201c0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
201d0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
201e0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
201f0 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a  UNC_UNLIKELY ){.
20200 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20210 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20  nFarg>=1 );.    
20220 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
20230 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
20240 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20250 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
20260 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69  et);.      }..#i
20270 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
20280 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41  G.      /* The A
20290 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69  FFINITY() functi
202a0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
202b0 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
202c0 73 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a  scribes.      **
202d0 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
202e0 74 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ty of the argume
202f0 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  nt.  This is use
20300 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66  d for testing of
20310 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51  .      ** the SQ
20320 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e  Lite type logic.
20330 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20340 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
20350 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20360 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20  C_AFFINITY ){.  
20370 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
20380 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62   *azAff[] = { "b
20390 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e  lob", "text", "n
203a0 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65  umeric", "intege
203b0 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20  r", "real" };.  
203c0 20 20 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a        char aff;.
203d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
203e0 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
203f0 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
20400 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 46  3ExprAffinity(pF
20410 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
20420 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20430 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
20440 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20  v, target, .    
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 20 20 20 20 20 20 20 20 20 61 66 66 20 3f 20            aff ? 
20470 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45  azAff[aff-SQLITE
20480 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f  _AFF_BLOB] : "no
20490 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ne");.        re
204a0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
204b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
204c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
204d0 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
204e0 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
204f0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
20500 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
20510 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
20520 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
20530 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
20540 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
20550 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
20560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20570 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
20580 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20590 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
205a0 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
205b0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
205c0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
205d0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
205e0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
205f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20600 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
20610 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
20620 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
20630 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
20640 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
20650 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
20660 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
20670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20680 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20690 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
206a0 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
206b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
206c0 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
206d0 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
206e0 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
206f0 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
20700 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
20710 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
20720 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
20730 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
20740 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
20750 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
20760 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
20770 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
20780 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
20790 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
207a0 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
207b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
207c0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
207d0 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
207e0 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
207f0 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
20800 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
20810 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
20820 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
20830 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
20840 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
20850 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
20860 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
20870 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20880 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
20890 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
208a0 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
208b0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
208c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
208d0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
208e0 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
208f0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
20900 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
20910 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
20920 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
20930 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
20940 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20950 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20960 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
20970 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
20980 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
20990 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
209b0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
209c0 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
209d0 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
209e0 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
209f0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
20a00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20a10 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
20a20 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
20a30 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
20a40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20a50 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
20a60 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
20a70 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
20aa0 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45  L_DUP|SQLITE_ECE
20ab0 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20  L_FACTOR);.     
20ac0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
20ad0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20  chePop(pParse); 
20ae0 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
20af0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
20b00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20b10 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20      r1 = 0;.    
20b20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
20b30 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
20b40 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
20b50 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
20b60 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
20b70 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
20b80 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
20b90 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
20ba0 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
20bb0 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
20bc0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
20bd0 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
20be0 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
20bf0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
20c00 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
20c10 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
20c20 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
20c30 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
20c40 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
20c50 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
20c60 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
20c70 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
20c80 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
20c90 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
20ca0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
20cb0 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
20cc0 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
20cd0 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
20ce0 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
20cf0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
20d00 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
20d10 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
20d20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
20d30 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
20d40 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
20d50 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
20d60 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
20d70 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
20d80 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
20d90 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
20da0 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
20db0 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
20dc0 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
20dd0 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
20de0 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d       if( nFarg>=
20df0 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
20e00 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
20e10 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
20e20 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
20e30 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
20e40 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
20e50 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
20e60 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
20e70 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
20e80 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
20e90 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
20ea0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
20eb0 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
20ec0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
20ed0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
20ee0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
20ef0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
20f00 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
20f10 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
20f20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
20f30 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
20f40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20f50 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
20f60 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
20f70 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
20f80 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
20f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
20fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20fb0 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20  , OP_Function0, 
20fc0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
20fd0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
20ff0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
21000 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
21010 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21020 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
21030 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
21040 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
21050 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
21060 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21070 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
21080 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
21090 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
210a0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
210b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
210c0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
210d0 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
210e0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
210f0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f   {.      int nCo
21100 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
21110 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
21120 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
21130 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
21140 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  T );.      if( o
21150 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
21160 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78  (nCol = pExpr->x
21170 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
21180 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20  ->nExpr)!=1 ){. 
21190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75         sqlite3Su
211a0 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
211b0 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  rse, nCol, 1);. 
211c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
211d0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
211e0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
211f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
21200 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
21210 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21220 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
21230 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  ECT_COLUMN: {.  
21240 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
21250 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
21260 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  t->iTable==0 ){.
21270 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
21280 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73  Left->iTable = s
21290 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
212a0 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
212b0 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b  r->pLeft, 0, 0);
212c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
212d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
212e0 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
212f0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
21300 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
21310 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
21320 65 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70  e.       && pExp
21330 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20  r->iTable!=(n = 
21340 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
21350 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65  rSize(pExpr->pLe
21360 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  ft)) .      ){. 
21370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
21380 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
21390 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67  %d columns assig
213a0 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a  ned %d values",.
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e  pExpr->iTable, n
213e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
213f0 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
21400 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70  Left->iTable + p
21410 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
21420 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
21430 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
21440 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
21450 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21460 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
21470 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
21480 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21490 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
214a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
214b0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
214c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
214d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
214e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
214f0 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
21500 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
21510 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21520 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
21530 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
21540 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
21550 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
21560 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
21570 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21580 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
21590 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20   target, 0);.   
215a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
215b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
215c0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
215d0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
215e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
215f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21600 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
21610 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
21620 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
21630 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
21640 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
21650 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21660 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
21670 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
21680 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
21690 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
216a0 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
216b0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
216c0 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
216d0 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
216e0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
216f0 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
21700 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
21710 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65  TWEEN: {.      e
21720 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
21730 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
21740 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rget, 0, 0);.   
21750 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
21760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21770 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61   TK_SPAN:.    ca
21780 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a  se TK_COLLATE: .
21790 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
217a0 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  S: {.      retur
217b0 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
217c0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
217d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
217e0 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rget);.    }..  
217f0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
21800 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
21810 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
21820 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
21830 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
21840 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
21850 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
21860 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
21870 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
21880 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
21890 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
218a0 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
218b0 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
218c0 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
218d0 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
218e0 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
218f0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
21900 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
21910 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
21920 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
21930 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
21940 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
21950 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
21960 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
21970 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
21980 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
21990 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
219a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
219b0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
219c0 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
219d0 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
219e0 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
219f0 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
21a00 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
21a10 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
21a20 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
21a30 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
21a40 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
21a50 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
21a60 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
21a70 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
21a80 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
21a90 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
21aa0 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
21ab0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
21ac0 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
21ad0 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
21ae0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
21af0 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
21b00 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
21b10 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
21b20 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
21b30 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
21b40 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
21b50 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
21b60 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
21b70 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
21b80 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
21b90 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
21ba0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
21bb0 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
21bc0 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
21bd0 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
21be0 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
21bf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21c00 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
21c10 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
21c20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
21c30 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
21c40 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
21c50 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21c60 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
21c70 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
21c80 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
21c90 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
21ca0 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
21cb0 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
21cc0 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
21cd0 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
21ce0 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
21cf0 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
21d00 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
21d10 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
21d20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
21d30 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
21d40 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
21d50 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
21d60 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
21d70 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
21d80 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
21d90 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
21da0 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
21db0 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
21dc0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
21dd0 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
21de0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
21df0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
21e00 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
21e10 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
21e20 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
21e30 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
21e40 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
21e50 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
21e60 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
21e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21e80 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
21e90 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21ea0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
21eb0 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a  "%s.%s -> $%d",.
21ec0 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
21ed0 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
21ee0 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
21ef0 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
21f00 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
21f10 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
21f20 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
21f30 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
21f40 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29   target.      ))
21f50 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
21f60 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
21f70 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
21f80 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
21f90 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
21fa0 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
21fb0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
21fc0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
21fd0 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
21fe0 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
21ff0 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
22000 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a   real..      **.
22010 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
22020 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37  E-OF: R-60985-57
22030 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  662 SQLite will 
22040 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75  convert the valu
22050 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20  e back to.      
22060 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
22070 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e  t when extractin
22080 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65  g it from the re
22090 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cord.  */.      
220a0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
220b0 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
220c0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
220d0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
220e0 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
220f0 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
22100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22110 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
22120 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
22130 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
22140 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
22150 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
22160 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20  e TK_VECTOR: {. 
22170 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
22180 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
22190 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
221a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
221b0 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
221c0 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20  TK_IF_NULL_ROW: 
221d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
221e0 49 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49  INR;.      addrI
221f0 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  NR = sqlite3Vdbe
22200 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
22210 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69  ullRow, pExpr->i
22220 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  Table);.      sq
22230 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
22240 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
22250 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
22260 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
22270 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
22280 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
22290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
222a0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
222b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
222c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
222d0 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73  ddrINR);.      s
222e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
222f0 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69  P3(v, addrINR, i
22300 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
22310 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
22320 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
22330 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
22340 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
22350 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
22360 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
22370 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
22380 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
22390 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
223a0 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
223b0 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
223c0 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
223d0 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
223e0 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
223f0 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
22400 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
22410 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
22420 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
22430 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
22440 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
22450 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
22460 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
22470 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
22480 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
22490 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
224a0 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
224b0 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
224c0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
224d0 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
224e0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
224f0 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
22500 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
22510 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
22520 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
22530 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
22540 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
22550 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
22560 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
22570 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
22580 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
22590 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
225a0 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
225b0 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
225c0 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
225d0 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
225e0 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
225f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22600 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
22610 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
22620 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
22630 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
22640 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
22650 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
22660 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
22670 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
22680 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
22690 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
226a0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
226b0 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
226c0 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
226d0 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
22700 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
22710 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
22720 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
22750 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
22760 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
22770 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
227a0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
227b0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
227e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
227f0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
22800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22810 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
22820 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
22830 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
22840 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
22850 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
22860 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
22870 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
22880 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
22890 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
228a0 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
228b0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
228e0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
228f0 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
22900 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22910 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
22920 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
22930 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
22940 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
22950 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20  int iCacheLevel 
22960 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
22970 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20  Level; )..      
22980 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
22990 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
229a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26  EP_xIsSelect) &&
229b0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
229c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
229d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
229e0 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20  nExpr > 0);.    
229f0 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
22a00 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
22a10 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
22a20 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
22a30 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
22a40 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61  xpr;.      endLa
22a50 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
22a60 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22a70 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
22a80 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
22a90 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  ){.        tempX
22aa0 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20   = *pX;.        
22ab0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
22ac0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
22ad0 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67         exprToReg
22ae0 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78  ister(&tempX, ex
22af0 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
22b00 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
22b10 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
22b20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
22b30 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
22b40 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d     memset(&opCom
22b50 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pare, 0, sizeof(
22b60 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20  opCompare));.   
22b70 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
22b80 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
22b90 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
22ba0 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
22bb0 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
22bc0 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
22bd0 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
22be0 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
22bf0 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
22c00 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
22c10 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
22c20 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
22c30 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
22c40 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
22c50 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
22c60 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
22c70 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
22c80 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
22c90 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
22ca0 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
22cb0 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
22cc0 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
22cd0 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
22ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22cf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
22d00 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
22d10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22d20 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
22d30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
22d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
22d50 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29  sert( pTest!=0 )
22d60 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  ;.          opCo
22d70 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
22d80 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
22d90 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
22da0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
22db0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
22dc0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
22dd0 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
22de0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
22df0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
22e00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22e10 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
22e20 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
22e30 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
22e40 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
22e50 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
22e60 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
22e70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22e80 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
22e90 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  .pExpr->op==TK_C
22ea0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
22eb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22ec0 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
22ed0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
22ee0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
22ef0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
22f00 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
22f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22f20 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
22f30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22f40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
22f50 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
22f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22f70 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20  f( (nExpr&1)!=0 
22f80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22f90 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
22fa0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
22fb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22fc0 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
22fd0 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70  >a[nExpr-1].pExp
22fe0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
22ff0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23000 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
23010 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23020 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23030 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
23040 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
23050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
23060 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
23070 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
23080 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
23090 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
230a0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
230b0 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
230c0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
230d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
230e0 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
230f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23100 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
23110 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
23120 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
23130 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
23140 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
23150 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
23160 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
23170 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
23180 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
23190 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
231a0 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
231b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
231c0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
231d0 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
231e0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
231f0 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
23200 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23210 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
23220 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
23230 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
23240 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
23250 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
23260 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
23270 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
23280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23290 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
232a0 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
232b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
232c0 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
232d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
232e0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
232f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23300 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
23310 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
23320 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
23330 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
23340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23350 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
23360 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
23370 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
23380 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
23390 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ken,0);.        
233a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
233b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
233c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
233d0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
233e0 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
233f0 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
23420 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
23430 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
23440 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
23450 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23460 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  }.#endif.  }.  s
23470 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
23480 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
23490 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
234a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
234b0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
234c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65  );.  return inRe
234d0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74  g;.}../*.** Fact
234e0 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20  or out the code 
234f0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
23500 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69  ression to initi
23510 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
23520 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74  **.** If regDest
23530 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73  >=0 then the res
23540 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74  ult is always st
23550 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67  ored in that reg
23560 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a  ister and the.**
23570 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72   result is not r
23580 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67  eusable.  If reg
23590 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73  Dest<0 then this
235a0 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65   routine is free
235b0 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68   to .** store th
235c0 65 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65  e value whereeve
235d0 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65  r it wants.  The
235e0 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
235f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
23600 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20  ** is stored is 
23610 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20  returned.  When 
23620 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69  regDest<0, two i
23630 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73  dentical express
23640 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64  ions will.** cod
23650 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65  e to the same re
23660 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
23670 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
23680 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70  Init(.  Parse *p
23690 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
236a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
236b0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
236c0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
236d0 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68  ssion to code wh
236e0 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74  en the VDBE init
236f0 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74  ializes */.  int
23700 20 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f   regDest       /
23710 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75  * Store the valu
23720 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
23730 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  er */.){.  ExprL
23740 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ist *p;.  assert
23750 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
23760 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d  pParse) );.  p =
23770 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
23780 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65  xpr;.  if( regDe
23790 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20  st<0 && p ){.   
237a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
237b0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
237c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
237d0 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70  (pItem=p->a, i=p
237e0 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49  ->nExpr; i>0; pI
237f0 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20  tem++, i--){.   
23800 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65     if( pItem->re
23810 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65  usable && sqlite
23820 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70  3ExprCompare(0,p
23830 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70  Item->pExpr,pExp
23840 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r,-1)==0 ){.    
23850 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
23860 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
23870 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
23880 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73  .  }.  pExpr = s
23890 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
238a0 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
238b0 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
238c0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
238d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
238e0 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
238f0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23900 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
23910 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
23920 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
23930 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44  >reusable = regD
23940 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20  est<0;.     if( 
23950 72 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44  regDest<0 ) regD
23960 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  est = ++pParse->
23970 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d  nMem;.     pItem
23980 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
23990 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d  g = regDest;.  }
239a0 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
239b0 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74  tExpr = p;.  ret
239c0 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a  urn regDest;.}..
239d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
239e0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
239f0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
23a00 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
23a10 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
23a20 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
23a30 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
23a40 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
23a50 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
23a60 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
23a70 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
23a80 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
23a90 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
23aa0 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
23ab0 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
23ac0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
23ad0 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
23ae0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
23af0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
23b00 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
23b10 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  o zero..**.** If
23b20 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73   pExpr is a cons
23b30 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
23b40 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65  routine might ge
23b50 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63  nerate this.** c
23b60 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20  ode to fill the 
23b70 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
23b80 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73  initialization s
23b90 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ection of the.**
23ba0 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69   VDBE program, i
23bb0 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f  n order to facto
23bc0 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20  r it out of the 
23bd0 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e  evaluation loop.
23be0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
23bf0 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
23c00 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
23c10 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
23c20 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20  g){.  int r2;.  
23c30 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
23c40 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
23c50 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e  Expr);.  if( Con
23c60 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
23c70 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  e).   && pExpr->
23c80 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a  op!=TK_REGISTER.
23c90 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
23ca0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
23cb0 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20  in(pExpr).  ){. 
23cc0 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
23cd0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
23ce0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
23cf0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29  arse, pExpr, -1)
23d00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
23d10 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
23d20 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
23d30 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  );.    r2 = sqli
23d40 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
23d50 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
23d60 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32   r1);.    if( r2
23d70 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70  ==r1 ){.      *p
23d80 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65  Reg = r1;.    }e
23d90 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
23da0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
23db0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
23dc0 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
23dd0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23de0 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
23df0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
23e00 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
23e10 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
23e20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
23e30 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
23e40 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
23e50 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
23e60 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
23e70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
23e80 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f  er target..*/.vo
23e90 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
23ea0 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
23eb0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
23ec0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
23ed0 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
23ee0 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
23ef0 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
23f00 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
23f10 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
23f20 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
23f30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23f40 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
23f50 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
23f60 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
23f70 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
23f80 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
23f90 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
23fa0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
23fb0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
23fc0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
23fd0 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  dbe!=0 || pParse
23fe0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
23ff0 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  ed );.    if( in
24000 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70  Reg!=target && p
24010 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
24020 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24030 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
24040 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
24050 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
24060 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
24070 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73  .** Make a trans
24080 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70  ient copy of exp
24090 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
240a0 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75  d then code it u
240b0 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45  sing.** sqlite3E
240c0 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73  xprCode().  This
240d0 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a   routine works j
240e0 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  ust like sqlite3
240f0 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78  ExprCode().** ex
24100 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e  cept that the in
24110 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
24120 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
24130 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  be unchanged..*/
24140 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24150 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20  rCodeCopy(Parse 
24160 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
24170 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
24180 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
24190 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
241a0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
241b0 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
241c0 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62  r, 0);.  if( !db
241d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
241e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
241f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24200 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74  target);.  sqlit
24210 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
24220 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
24230 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24240 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
24250 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
24260 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
24270 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
24280 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24290 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
242a0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
242b0 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
242c0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49  ister target.  I
242d0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
242e0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   is constant, th
242f0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
24300 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20  ** might choose 
24310 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72  to code the expr
24320 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61  ession at initia
24330 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
24340 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
24350 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
24360 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24370 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
24380 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20   target){.  if( 
24390 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
243a0 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33  actor && sqlite3
243b0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
243c0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
243d0 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
243e0 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
243f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
24400 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
24410 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
24420 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
24430 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
24440 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
24450 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69  evaluates the gi
24460 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
24470 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
24480 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
24490 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
244a0 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
244b0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
244c0 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
244d0 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
244e0 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
244f0 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
24500 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
24510 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
24520 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
24530 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
24540 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
24550 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
24560 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
24570 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
24580 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
24590 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
245a0 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
245b0 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
245c0 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
245d0 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
245e0 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
245f0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
24600 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
24610 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
24620 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
24630 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
24640 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
24650 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
24660 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
24670 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
24680 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
24690 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
246a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
246b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
246c0 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
246d0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
246e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
246f0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
24700 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
24710 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
24720 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
24730 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
24740 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
24750 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
24760 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
24770 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
24780 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
24790 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
247a0 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
247b0 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
247c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
247d0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
247e0 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a  ts evaluated..**
247f0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
24800 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
24810 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
24820 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
24830 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
24840 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
24850 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
24860 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
24870 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
24880 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
24890 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
248a0 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
248b0 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
248c0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
248d0 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n code..**.** Th
248e0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  e SQLITE_ECEL_RE
248f0 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  F flag means tha
24900 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  t expressions in
24910 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a   the list with.*
24920 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75  * ExprList.a[].u
24930 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
24940 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
24950 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
24960 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65   stored.** in re
24970 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65  gisters at srcRe
24980 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61  g, and so the va
24990 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65  lue can be copie
249a0 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f  d from there..*/
249b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
249c0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
249d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
249e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
249f0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
24a00 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
24a10 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
24a20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
24a30 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
24a40 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
24a50 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
24a60 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
24a70 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
24a80 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
24a90 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
24aa0 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
24ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
24ac0 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
24ad0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
24ae0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
24af0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
24b00 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
24b10 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
24b20 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
24b30 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
24b40 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
24b50 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
24b60 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
24b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
24b80 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
24b90 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
24ba0 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
24bb0 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
24bc0 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
24bd0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
24be0 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
24bf0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
24c00 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
24c10 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
24c20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
24c30 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
24c40 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
24c50 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
24c60 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
24c70 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
24c80 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d  LITE_ECEL_REF)!=
24c90 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d  0 && (j = pItem-
24ca0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
24cb0 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  )>0 ){.      if(
24cc0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
24cd0 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a  ECEL_OMITREF ){.
24ce0 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20          i--;.   
24cf0 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
24d00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
24d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24d20 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72  (v, copyOp, j+sr
24d30 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69  cReg-1, target+i
24d40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24d50 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
24d60 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
24d70 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69  CTOR)!=0 && sqli
24d80 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24d90 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
24da0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24db0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
24dc0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
24dd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24de0 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
24df0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
24e00 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
24e10 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
24e20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
24e30 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
24e40 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
24e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70  .        if( cop
24e60 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  yOp==OP_Copy.   
24e70 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71        && (pOp=sq
24e80 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
24e90 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d  , -1))->opcode==
24ea0 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20  OP_Copy.        
24eb0 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d   && pOp->p1+pOp-
24ec0 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20  >p3+1==inReg.   
24ed0 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32        && pOp->p2
24ee0 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67  +pOp->p3+1==targ
24ef0 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a  et+i.        ){.
24f00 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
24f10 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  3++;.        }el
24f20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
24f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24f40 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67  v, copyOp, inReg
24f50 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
24f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24f70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
24f80 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
24f90 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
24fa0 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  a BETWEEN operat
24fb0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42  or..**.**    x B
24fc0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a  ETWEEN y AND z.*
24fd0 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
24fe0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
24ff0 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41  .**.**    x>=y A
25000 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f  ND x<=z.**.** Co
25010 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74  de it as such, t
25020 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f  aking care to do
25030 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65   the common sube
25040 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69  xpression.** eli
25050 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a  mination of x..*
25060 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66  *.** The xJumpIf
25070 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
25080 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a  mines details:.*
25090 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20  *.**    NULL:   
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61  Store the boolea
250c0 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b  n result in reg[
250d0 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69  dest].**    sqli
250e0 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20  te3ExprIfTrue:  
250f0 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
25100 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73   if true.**    s
25110 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25120 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64  e:     Jump to d
25130 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a  est if false.**.
25140 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c  ** The jumpIfNul
25150 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  l parameter is i
25160 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49  gnored if xJumpI
25170 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  f is NULL..*/.st
25180 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
25190 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
251a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
251b0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
251c0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
251d0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
251e0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
251f0 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
25200 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
25210 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
25220 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
25230 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63  n or storage loc
25240 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ation */.  void 
25250 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c  (*xJump)(Parse*,
25260 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20  Expr*,int,int), 
25270 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b  /* Action to tak
25280 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
25290 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
252a0 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
252b0 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
252c0 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70   */.){. Expr exp
252d0 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65  rAnd;     /* The
252e0 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e   AND operator in
252f0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20    x>=y AND x<=z 
25300 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c   */.  Expr compL
25310 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20  eft;    /* The  
25320 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x>=y  term */.  
25330 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20  Expr compRight; 
25340 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20    /* The  x<=z  
25350 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65  term */.  Expr e
25360 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54  xprX;       /* T
25370 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73  he  x  subexpres
25380 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sion */.  int re
25390 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54  gFree1 = 0; /* T
253a0 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
253b0 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d  ister */...  mem
253c0 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30  set(&compLeft, 0
253d0 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
253e0 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52  .  memset(&compR
253f0 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ight, 0, sizeof(
25400 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
25410 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69  (&exprAnd, 0, si
25420 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20  zeof(Expr));..  
25430 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
25440 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
25450 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
25460 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
25470 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
25480 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
25490 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
254a0 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
254b0 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
254c0 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
254d0 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
254e0 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
254f0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
25500 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
25510 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
25520 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
25530 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
25540 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
25550 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
25560 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
25570 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
25580 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
25590 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
255a0 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70  ster(&exprX, exp
255b0 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
255c0 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
255d0 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78  Free1));.  if( x
255e0 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d  Jump ){.    xJum
255f0 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  p(pParse, &exprA
25600 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
25610 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
25620 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20      /* Mark the 
25630 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65  expression is be
25640 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ing from the ON 
25650 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
25660 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a  of a join.    **
25670 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c   so that the sql
25680 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
25690 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  et() routine wil
256a0 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
256b0 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20   move.    ** it 
256c0 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70  into the Parse.p
256d0 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20  ConstExpr list. 
256e0 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61   We should use a
256f0 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68 69   new bit for thi
25700 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c  s,.    ** for cl
25710 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72  arity, but we ar
25720 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e  e out of bits in
25730 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20   the Expr.flags 
25740 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20  field so we.    
25750 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73 65  ** have to reuse
25760 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
25770 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a   bit.  Bummer. *
25780 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67  /.    exprX.flag
25790 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  s |= EP_FromJoin
257a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
257b0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
257c0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
257d0 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  st);.  }.  sqlit
257e0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
257f0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
25800 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
25810 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
25820 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
25830 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
25840 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
25850 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
25860 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
25870 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25880 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
25890 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
258a0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
258b0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
258c0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
258d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
258e0 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
258f0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
25900 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
25910 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
25920 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
25930 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
25940 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
25950 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
25960 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
25970 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
25980 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
25990 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
259a0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
259b0 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
259c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
259d0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
259e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
259f0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
25a00 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
25a10 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
25a20 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
25a30 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
25a40 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
25a50 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
25a60 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
25a70 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
25a80 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Jump==0 );.}../*
25a90 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
25aa0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
25ab0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
25ac0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
25ad0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
25ae0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
25af0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
25b00 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
25b10 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
25b20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
25b30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25b40 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
25b50 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
25b60 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
25b70 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
25b80 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
25b90 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
25ba0 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
25bb0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
25bc0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
25bd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
25be0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
25bf0 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
25c00 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
25c10 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
25c20 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
25c30 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
25c40 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
25c50 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
25c60 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
25c70 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
25c80 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
25c90 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
25ca0 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
25cb0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
25cc0 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
25cd0 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
25ce0 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
25cf0 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
25d00 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
25d10 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
25d20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
25d30 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
25d40 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
25d50 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
25d60 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
25d70 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
25d80 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
25d90 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
25da0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
25db0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
25dc0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
25dd0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
25de0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
25df0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
25e00 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
25e10 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25e20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
25e30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
25e40 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
25e50 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
25e60 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
25e70 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
25e80 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
25e90 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
25ea0 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
25eb0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
25ec0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
25ed0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
25ee0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
25ef0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
25f00 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
25f10 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
25f20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
25f30 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
25f40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25f50 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e  Left, d2,jumpIfN
25f60 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
25f70 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
25f80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
25f90 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
25fa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
25fb0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
25fc0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
25fd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25fe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
25ff0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
26000 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
26010 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
26020 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
26030 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26040 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
26050 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26060 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26070 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26080 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
26090 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
260a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
260b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
260c0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
260d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
260e0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
260f0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26100 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26110 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
26120 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
26130 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
26140 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26150 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
26160 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26170 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26190 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
261a0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
261b0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
261c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
261d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
261e0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
261f0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
26200 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
26210 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26220 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
26230 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
26240 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
26250 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
26260 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
26270 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
26280 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
26290 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
262a0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
262b0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
262c0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
262d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
262e0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
262f0 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
26300 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
26310 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
26320 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
26330 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
26340 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
26350 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
26360 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26370 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26380 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
26390 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
263a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
263b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
263c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
263d0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
263e0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
263f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26400 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26410 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
26420 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
26430 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26440 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26450 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
26460 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
26470 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26480 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
26490 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
264a0 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
264b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
264c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
264d0 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
264e0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
264f0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
26500 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
26510 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26520 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
26530 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
26540 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
26550 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
26560 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26570 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
26580 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
26590 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
265a0 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
265b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
265c0 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
265d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
265e0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
265f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
26600 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
26610 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
26620 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
26630 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
26640 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
26650 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
26660 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26670 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
26680 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
26690 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
266a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
266b0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
266c0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
266d0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
266e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
266f0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26700 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26710 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
26720 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26730 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
26740 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
26750 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
26760 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
26770 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
26780 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
26790 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
267a0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
267b0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
267c0 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
267d0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
267e0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
267f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26800 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26810 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
26820 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
26830 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
26840 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
26850 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26860 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
26870 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
26880 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26890 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
268a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
268b0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
268c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
268d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
268e0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
268f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26900 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
26910 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
26920 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
26930 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
26940 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  fTrue, jumpIfNul
26950 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
26960 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
26970 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
26980 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
26990 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
269a0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
269b0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
269c0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
269d0 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
269e0 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
269f0 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
26a00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26a10 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
26a20 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
26a30 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
26a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26a50 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
26a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26a70 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
26a80 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
26a90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26aa0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
26ab0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
26ac0 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20  ult_expr:.      
26ad0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
26ae0 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
26af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26b00 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
26b10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
26b20 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
26b30 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
26b40 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
26b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26b60 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
26b70 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
26b80 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
26b90 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
26ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26bb0 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
26bc0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
26bd0 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
26be0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
26bf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26c00 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26c10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26c20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
26c40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
26c50 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
26c60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
26c70 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
26c80 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
26c90 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
26ca0 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
26cb0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
26cc0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
26cd0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
26ce0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
26cf0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
26d00 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
26d10 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
26d20 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
26d30 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
26d40 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
26d50 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
26d60 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
26d70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
26d80 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
26d90 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
26da0 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
26db0 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
26dc0 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
26dd0 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
26de0 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
26df0 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
26e00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26e10 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
26e20 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
26e30 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
26e40 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
26e50 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
26e60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
26e70 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
26e80 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
26e90 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
26ea0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
26eb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
26ec0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
26ed0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
26ee0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26ef0 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
26f00 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
26f10 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
26f20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
26f30 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
26f40 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
26f50 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
26f60 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
26f70 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
26f80 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
26f90 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
26fa0 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
26fb0 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
26fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
26fd0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
26fe0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
26ff0 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
27000 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
27010 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
27020 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
27030 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27050 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
27060 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
27070 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
27080 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
27090 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
270a0 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
270b0 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
270c0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
270e0 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
270f0 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
27100 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
27110 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
27120 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
27130 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
27140 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
27150 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
27160 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
27170 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
27180 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
27190 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
271a0 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
271b0 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
271c0 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
271d0 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
271e0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
271f0 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
27200 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
27210 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
27220 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
27230 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
27240 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
27250 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
27260 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
27270 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
27280 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27290 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
272a0 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
272b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
272c0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
272d0 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
272e0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
272f0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
27300 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
27310 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
27320 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
27330 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
27340 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
27350 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
27360 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
27370 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
27380 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
27390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
273a0 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
273b0 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
273c0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
273d0 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
273e0 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
273f0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
27400 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
27410 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
27420 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27430 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27440 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27450 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27460 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
27470 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
27480 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
27490 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
274a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
274b0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
274c0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
274d0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
274e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
274f0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
27500 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27510 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
27520 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
27530 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
27540 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
27550 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27560 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27570 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27580 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
27590 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
275a0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
275b0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
275c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
275d0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
275e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
275f0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
27600 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
27610 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
27620 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
27630 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
27640 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
27650 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27660 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
27670 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27680 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
27690 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
276a0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
276b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
276c0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
276d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
276e0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
276f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
27700 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27710 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
27720 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
27730 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
27740 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
27750 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27760 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
27770 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
27780 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
27790 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
277a0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_EQ;.      jum
277b0 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
277c0 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
277d0 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
277e0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
277f0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
27800 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
27810 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
27820 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
27830 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
27840 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
27850 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
27860 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
27870 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
27880 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27890 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
278a0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
278b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
278c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
278d0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
278e0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
278f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27900 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27910 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
27920 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
27930 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
27940 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
27950 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
27960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27970 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
27980 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27990 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
279a0 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
279b0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
279c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
279d0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
279e0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
279f0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
27a00 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
27a10 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
27a20 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
27a30 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
27a40 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
27a50 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
27a60 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
27a70 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
27a80 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
27a90 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
27aa0 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
27ab0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27ac0 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
27ad0 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
27ae0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27af0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
27b00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27b10 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
27b20 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
27b30 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
27b40 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27b50 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27b60 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
27b70 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
27b80 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
27b90 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
27ba0 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
27bb0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27bc0 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
27bd0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
27be0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
27bf0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27c00 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27c10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
27c20 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27c30 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27c40 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27c50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27c60 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
27c70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27c80 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
27c90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
27ca0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
27cb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
27cc0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
27cd0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
27ce0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
27cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27d00 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
27d10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27d20 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
27d30 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
27d40 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
27d50 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
27d60 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
27d70 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
27d80 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
27d90 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
27da0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
27db0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
27dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27dd0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
27de0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
27df0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27e00 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
27e10 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
27e20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
27e30 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
27e40 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  False, jumpIfNul
27e50 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
27e60 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
27e70 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
27e80 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
27e90 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
27ea0 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  jumpIfNull ){.  
27eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27ec0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
27ed0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
27ee0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
27ef0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73  .        int des
27f00 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
27f10 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
27f20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27f30 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
27f40 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
27f50 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
27f60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27f70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
27f80 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
27f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
27fa0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
27fb0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
27fc0 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
27fd0 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  : .      if( exp
27fe0 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
27ff0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
28000 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
28010 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
28020 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
28030 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
28040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
28050 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
28060 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
28070 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
28080 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
28090 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
280a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
280b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
280c0 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
280d0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
280e0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
280f0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
28100 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
28110 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
28120 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
28130 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
28140 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
28150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
28160 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
28170 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
28180 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
28190 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
281a0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
281b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
281c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
281d0 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
281e0 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
281f0 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
28200 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
28210 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
28220 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
28230 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
28240 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
28250 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
28260 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
28270 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
28280 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
28290 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
282a0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
282b0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
282c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
282d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
282e0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
282f0 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
28300 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
28310 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
28320 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
28330 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
28340 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28350 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
28360 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
28370 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
28380 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
28390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  ;.}../*.** Expre
283a0 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20 67 75  ssion pVar is gu
283b0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
283c0 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20  n SQL variable. 
283d0 70 45 78 70 72 20 6d 61 79 20 62 65 20 61 6e 79  pExpr may be any
283e0 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78 70 72  .** type of expr
283f0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ession..**.** If
28400 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70   pExpr is a simp
28410 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d 20 61  le SQL value - a
28420 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c  n integer, real,
28430 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a   string, blob.**
28440 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d   or NULL value -
28450 20 74 68 65 6e 20 74 68 65 20 56 44 42 45 20 63   then the VDBE c
28460 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70  urrently being p
28470 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e 66 69  repared is confi
28480 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70  gured.** to re-p
28490 72 65 70 61 72 65 20 65 61 63 68 20 74 69 6d 65  repare each time
284a0 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20   a new value is 
284b0 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c  bound to variabl
284c0 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64  e pVar..**.** Ad
284d0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70  ditionally, if p
284e0 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65  Expr is a simple
284f0 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64 20 74   SQL value and t
28500 68 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a  he value is the.
28510 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  ** same as that 
28520 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20  currently bound 
28530 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72  to variable pVar
28540 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  , non-zero is re
28550 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
28560 77 69 73 65 2c 20 69 66 20 74 68 65 20 76 61 6c  wise, if the val
28570 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68 65 20  ues are not the 
28580 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78 70 72  same or if pExpr
28590 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
285a0 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a  .** SQL value, z
285b0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
285c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
285d0 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62  xprCompareVariab
285e0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
285f0 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20 45 78  , Expr *pVar, Ex
28600 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
28610 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74  t res = 0;.  int
28620 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74 65 33   iVar;.  sqlite3
28630 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20  _value *pL, *pR 
28640 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  = 0;.  .  sqlite
28650 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  3ValueFromExpr(p
28660 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
28670 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
28680 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20  QLITE_AFF_BLOB, 
28690 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52 20 29  &pR);.  if( pR )
286a0 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70 56 61  {.    iVar = pVa
286b0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
286c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
286d0 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
286e0 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20  dbe, iVar);.    
286f0 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pL = sqlite3Vdbe
28700 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 50  GetBoundValue(pP
28710 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
28720 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45 5f 41  , iVar, SQLITE_A
28730 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66  FF_BLOB);.    if
28740 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  ( pL ){.      if
28750 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
28760 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45  type(pL)==SQLITE
28770 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
28780 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
28790 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65  ext(pL); /* Make
287a0 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f 64 69   sure the encodi
287b0 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20  ng is UTF-8 */. 
287c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
287d0 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65   =  0==sqlite3Me
287e0 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c  mCompare(pL, pR,
287f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
28800 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
28810 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pR);.    sqlite3
28820 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a 20  ValueFree(pL);. 
28830 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73   }..  return res
28840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
28850 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
28860 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
28870 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
28880 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a   0 if the two.**
28890 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
288a0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e   completely iden
288b0 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31  tical.  Return 1
288c0 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
288d0 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c  only.** by a COL
288e0 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74  LATE operator at
288f0 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20   the top level. 
28900 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65   Return 2 if the
28910 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
28920 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  es.** other than
28930 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43   the top-level C
28940 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
28950 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
28960 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
28970 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
28980 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
28990 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
289a0 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
289b0 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
289c0 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
289d0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
289e0 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20  b..**.** The pA 
289f0 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73  side might be us
28a00 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e  ing TK_REGISTER.
28a10 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
28a20 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a   case and pB is.
28a30 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f  ** not using TK_
28a40 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20  REGISTER but is 
28a50 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61  otherwise equiva
28a60 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c  lent, then still
28a70 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
28a80 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
28a90 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
28aa0 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68  urn 2 even if th
28ab0 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
28ac0 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20  s.** really are 
28ad0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20  equivalent.  If 
28ae0 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20  we cannot prove 
28af0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
28b00 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e  ions are.** iden
28b10 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e  tical, we return
28b20 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61   2 just to be sa
28b30 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  fe.  So if this 
28b40 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
28b50 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64  ns 2, then you d
28b60 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
28b70 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
28b80 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
28b90 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
28ba0 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
28bb0 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72  u get a 0 or 1 r
28bc0 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a  eturn, then you.
28bd0 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  ** can be sure t
28be0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
28bf0 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e  re the same.  In
28c00 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72   the places wher
28c10 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
28c20 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f  e is used, it do
28c30 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67  es not hurt to g
28c40 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20  et an extra 2 - 
28c50 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
28c60 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
28c70 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
28c80 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
28c90 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
28ca0 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f  orrect 0 or 1 co
28cb0 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
28cc0 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  lfunction..**.**
28cd0 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e 6f   If pParse is no
28ce0 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56  t NULL then TK_V
28cf0 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20 69 6e  ARIABLE terms in
28d00 20 70 41 20 77 69 74 68 20 62 69 6e 64 69 6e 67   pA with binding
28d10 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  s in.** pParse->
28d20 70 52 65 70 72 65 70 61 72 65 20 63 61 6e 20 62  pReprepare can b
28d30 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  e matched agains
28d40 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20 70 42  t literals in pB
28d50 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61 72 73  .  The .** pPars
28d60 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73  e->pVdbe->expmas
28d70 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75 70 64  k bitmask is upd
28d80 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 76 61  ated for each va
28d90 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  riable reference
28da0 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20  d..** If pParse 
28db0 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72  is NULL (the nor
28dc0 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e 20 61  mal case) then a
28dd0 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74  ny TK_VARIABLE t
28de0 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d  erm in .** Argum
28df0 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f 75 6c  ent pParse shoul
28e00 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55  d normally be NU
28e10 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  LL. If it is not
28e20 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a   NULL and pA or.
28e30 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61 20 72  ** pB causes a r
28e40 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32  eturn value of 2
28e50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28e60 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61 72 73  ExprCompare(Pars
28e70 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
28e80 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69  *pA, Expr *pB, i
28e90 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20  nt iTab){.  u32 
28ea0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20  combinedFlags;. 
28eb0 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
28ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
28ed0 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32  n pB==pA ? 0 : 2
28ee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
28ef0 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b  se && pA->op==TK
28f00 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65 78 70  _VARIABLE && exp
28f10 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65  rCompareVariable
28f20 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70 42 29  (pParse, pA, pB)
28f30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
28f40 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64  ;.  }.  combined
28f50 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67  Flags = pA->flag
28f60 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20  s | pB->flags;. 
28f70 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
28f80 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
28f90 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d   ){.    if( (pA-
28fa0 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73  >flags&pB->flags
28fb0 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30  &EP_IntValue)!=0
28fc0 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   && pA->u.iValue
28fd0 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  ==pB->u.iValue )
28fe0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
28ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
29000 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
29010 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
29020 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
29030 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
29040 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29050 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
29060 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c 32 20  Left,pB,iTab)<2 
29070 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29080 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
29090 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pB->op==TK_COLL
290a0 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
290b0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
290c0 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74 2c 69  , pA,pB->pLeft,i
290d0 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
290e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
290f0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
29100 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
29110 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
29120 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
29130 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  MN && pA->u.zTok
29140 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  en ){.    if( pA
29150 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
29160 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  N ){.      if( s
29170 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41  qlite3StrICmp(pA
29180 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
29190 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
291a0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
291b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d  e if( strcmp(pA-
291c0 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
291d0 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
291e0 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f      return pA->o
291f0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20  p==TK_COLLATE ? 
29200 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 : 2;.    }.  }
29210 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
29220 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
29230 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
29240 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
29250 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c  turn 2;.  if( AL
29260 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
29270 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
29280 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  ly)==0) ){.    i
29290 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
292a0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
292b0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
292c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
292d0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
292e0 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
292f0 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  eft, iTab) ) ret
29300 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
29310 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29320 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 52  e(pParse, pA->pR
29330 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
29340 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
29350 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
29360 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
29370 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
29380 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
29390 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
293a0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63     if( ALWAYS((c
293b0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
293c0 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26  P_Reduced)==0) &
293d0 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  & pA->op!=TK_STR
293e0 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ING ){.      if(
293f0 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
29400 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
29410 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 2;.      if( 
29420 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
29430 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26  iTable .       &
29440 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69  & (pA->iTable!=i
29450 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d  Tab || NEVER(pB-
29460 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72  >iTable>=0)) ) r
29470 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
29480 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
29490 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
294a0 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
294b0 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
294c0 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
294d0 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
294e0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
294f0 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
29500 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
29510 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
29520 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
29530 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
29540 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
29550 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
29560 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
29570 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
29580 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
29590 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ab..**.** This r
295a0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74  outine might ret
295b0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72  urn non-zero for
295c0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72   equivalent Expr
295d0 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f  Lists.  The.** o
295e0 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  nly consequence 
295f0 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64  will be disabled
29600 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20   optimizations. 
29610 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
29620 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20  e.** must never 
29630 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
29640 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
29650 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ects are differe
29660 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66  nt, or.** a malf
29670 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
29680 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  ult..**.** Two N
29690 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65  ULL pointers are
296a0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
296b0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
296c0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a   a NULL pointer.
296d0 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72  ** always differ
296e0 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c  s from a non-NUL
296f0 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  L pointer..*/.in
29700 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  t sqlite3ExprLis
29710 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73  tCompare(ExprLis
29720 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20  t *pA, ExprList 
29730 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
29740 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
29750 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
29760 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
29770 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
29780 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
29790 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
297a0 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
297b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
297c0 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
297d0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
297e0 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
297f0 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
29800 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
29810 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
29820 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
29830 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
29840 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
29850 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29860 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
29870 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69  ExprA, pExprB, i
29880 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Tab) ) return 1;
29890 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
298a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73  .}../*.** Like s
298b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
298c0 65 28 29 20 65 78 63 65 70 74 20 43 4f 4c 4c 41  e() except COLLA
298d0 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 74 20  TE operators at 
298e0 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a  the top-level.**
298f0 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f   are ignored..*/
29900 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
29910 43 6f 6d 70 61 72 65 53 6b 69 70 28 45 78 70 72  CompareSkip(Expr
29920 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20   *pA, Expr *pB, 
29930 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 72 65 74  int iTab){.  ret
29940 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
29950 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20 20 20 20  ompare(0,.      
29960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
29970 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41  prSkipCollate(pA
29980 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
29990 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
299a0 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20 20 20 20  ollate(pB),.    
299b0 20 20 20 20 20 20 20 20 20 69 54 61 62 29 3b 0a           iTab);.
299c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
299d0 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70  true if we can p
299e0 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c  rove the pE2 wil
299f0 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65  l always be true
29a00 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72   if pE1 is.** tr
29a10 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ue.  Return fals
29a20 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63  e if we cannot c
29a30 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f  omplete the proo
29a40 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68  f or if pE2 migh
29a50 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20  t.** be false.  
29a60 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
29a70 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20      pE1: x==5   
29a80 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
29a90 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
29aa0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
29ab0 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45  1: x>0        pE
29ac0 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
29ad0 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
29ae0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  e.**     pE1: x=
29af0 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  21       pE2: x=
29b00 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52  21 OR y=43     R
29b10 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
29b20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20     pE1: x!=123  
29b30 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
29b40 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
29b50 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
29b60 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32  : x!=?1      pE2
29b70 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
29b80 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
29b90 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
29ba0 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53   NULL  pE2: x IS
29bb0 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
29bc0 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
29bd0 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20    pE1: x IS ?2  
29be0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
29bf0 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20  NULL    Reuslt: 
29c00 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  false.**.** When
29c10 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f   comparing TK_CO
29c20 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65  LUMN nodes betwe
29c30 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20  en pE1 and pE2, 
29c40 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78  if pE2 has.** Ex
29c50 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e  pr.iTable<0 then
29c60 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20   assume a table 
29c70 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20  number given by 
29c80 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  iTab..**.** If p
29c90 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Parse is not NUL
29ca0 4c 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  L, then the valu
29cb0 65 73 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69  es of bound vari
29cc0 61 62 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65  ables in pE1 are
29cd0 20 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67   .** compared ag
29ce0 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61  ainst literal va
29cf0 6c 75 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20  lues in pE2 and 
29d00 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65  pParse->pVdbe->e
29d10 78 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64  xpmask is.** mod
29d20 69 66 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20  ified to record 
29d30 77 68 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69  which bound vari
29d40 61 62 6c 65 73 20 61 72 65 20 72 65 66 65 72 65  ables are refere
29d50 6e 63 65 64 2e 20 20 49 66 20 70 50 61 72 73 65  nced.  If pParse
29d60 20 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68   .** is NULL, th
29d70 65 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65  en false will be
29d80 20 72 65 74 75 72 6e 65 64 20 69 66 20 70 45 31   returned if pE1
29d90 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f   contains any bo
29da0 75 6e 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  und variables..*
29db0 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
29dc0 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
29dd0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
29de0 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
29df0 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
29e00 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
29e10 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
29e20 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
29e30 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
29e40 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
29e50 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
29e60 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
29e70 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
29e80 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
29e90 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
29ea0 65 73 45 78 70 72 28 50 61 72 73 65 20 2a 70 50  esExpr(Parse *pP
29eb0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c  arse, Expr *pE1,
29ec0 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20   Expr *pE2, int 
29ed0 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c  iTab){.  if( sql
29ee0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
29ef0 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
29f00 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , iTab)==0 ){.  
29f10 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
29f20 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
29f30 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69  K_OR.   && (sqli
29f40 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
29f50 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20  pr(pParse, pE1, 
29f60 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
29f70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  ).             |
29f80 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  | sqlite3ExprImp
29f90 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
29fa0 20 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68   pE1, pE2->pRigh
29fb0 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a  t, iTab) ).  ){.
29fc0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
29fd0 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
29fe0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70  =TK_NOTNULL && p
29ff0 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  E1->op!=TK_ISNUL
2a000 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2a010 5f 49 53 20 29 7b 0a 20 20 20 20 45 78 70 72 20  _IS ){.    Expr 
2a020 2a 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70  *pX = sqlite3Exp
2a030 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 31  rSkipCollate(pE1
2a040 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 74 65  ->pLeft);.    te
2a050 73 74 63 61 73 65 28 20 70 58 21 3d 70 45 31 2d  stcase( pX!=pE1-
2a060 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 69 66  >pLeft );.    if
2a070 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2a080 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 58 2c  pare(pParse, pX,
2a090 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
2a0a0 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  b)==0 ) return 1
2a0b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2a0c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
2a0d0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2a0e0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2a0f0 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
2a100 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
2a110 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
2a120 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  an expression ca
2a130 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 62  n be evaluated b
2a140 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  y reference to t
2a150 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79  he.** index only
2a160 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  , without having
2a170 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20   to do a search 
2a180 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
2a190 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65  nding.** table e
2a1a0 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f  ntry.  The IdxCo
2a1b0 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69  ver.pIdx field i
2a1c0 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64  s the index.  Id
2a1d0 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69  xCover.iCur.** i
2a1e0 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
2a1f0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
2a200 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b  truct IdxCover {
2a210 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
2a220 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2a230 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f   to be tested fo
2a240 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  r coverage */.  
2a250 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
2a260 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2a270 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
2a280 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2a290 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b   the index */.};
2a2a0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
2a2b0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
2a2c0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
2a2d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
2a2e0 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   .** pWalker->u.
2a2f0 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20  pIdxCover->iCur 
2a300 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64  can be satisfied
2a310 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
2a320 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  .** pWalker->u.p
2a330 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a  IdxCover->pIdx..
2a340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
2a350 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65  prIdxCover(Walke
2a360 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2a370 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
2a380 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2a390 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72  LUMN.   && pExpr
2a3a0 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65  ->iTable==pWalke
2a3b0 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2a3c0 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74  iCur.   && sqlit
2a3d0 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
2a3e0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2a3f0 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70  over->pIdx, pExp
2a400 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20  r->iColumn)<0.  
2a410 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
2a420 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72  eCode = 1;.    r
2a430 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2a440 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2a450 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2a460 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2a470 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20  f an index pIdx 
2a480 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  on table with cu
2a490 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69  rsor iCur contai
2a4a0 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65  ns will.** the e
2a4b0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
2a4c0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2a4d0 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20   the index does 
2a4e0 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70  cover the.** exp
2a4f0 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73  ression and fals
2a500 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20 65  e if the pExpr e
2a510 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65  xpression refere
2a520 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d  nces table colum
2a530 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e  ns.** that are n
2a540 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  ot found in the 
2a550 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
2a560 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72  * An index cover
2a570 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
2a580 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  n means that the
2a590 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
2a5a0 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20  be.** evaluated 
2a5b0 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69  using only the i
2a5c0 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74  ndex and without
2a5d0 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75   having to looku
2a5e0 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  p the.** corresp
2a5f0 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74  onding table ent
2a600 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
2a610 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49  e3ExprCoveredByI
2a620 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45  ndex(.  Expr *pE
2a630 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  xpr,        /* T
2a640 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74  he index to be t
2a650 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ested */.  int i
2a660 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Cur,           /
2a670 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * The cursor num
2a680 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ber for the corr
2a690 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
2a6a0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
2a6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a6c0 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68 74  index that might
2a6d0 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76   be used for cov
2a6e0 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61  erage */.){.  Wa
2a6f0 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
2a700 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a   IdxCover xcov;.
2a710 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
2a720 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63  sizeof(w));.  xc
2a730 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  ov.iCur = iCur;.
2a740 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49    xcov.pIdx = pI
2a750 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  dx;.  w.xExprCal
2a760 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43  lback = exprIdxC
2a770 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78  over;.  w.u.pIdx
2a780 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20  Cover = &xcov;. 
2a790 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2a7a0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72  (&w, pExpr);.  r
2a7b0 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a  eturn !w.eCode;.
2a7c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  }.../*.** An ins
2a7d0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2a7e0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2a7f0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
2a800 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
2a810 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63  o count referenc
2a820 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75  es to table colu
2a830 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d  mns in the argum
2a840 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61  ents of an .** a
2a850 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2a860 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  n, in order to i
2a870 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
2a880 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54  sqlite3FunctionT
2a890 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65  hisSrc() routine
2a8a0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43  ..*/.struct SrcC
2a8b0 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74  ount {.  SrcList
2a8c0 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65   *pSrc;   /* One
2a8d0 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d   particular FROM
2a8e0 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73   clause in a nes
2a8f0 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ted query */.  i
2a900 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20  nt nThis;       
2a910 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
2a920 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2a930 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a  ns in pSrcList *
2a940 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20  /.  int nOther; 
2a950 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a960 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2a970 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72  columns in other
2a980 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f   FROM clauses */
2a990 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  .};../*.** Count
2a9a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2a9b0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2a9c0 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
2a9d0 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74  int exprSrcCount
2a9e0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2a9f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2aa00 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29    /* The NEVER()
2aa10 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   on the second t
2aa20 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73  erm is because s
2aa30 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2aa40 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a  esThisSrc().  **
2aa50 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65   is always calle
2aa60 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  d before sqlite3
2aa70 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2aa80 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74  gates() and so t
2aa90 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d  he.  ** TK_COLUM
2aaa0 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  Ns have not yet 
2aab0 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69  been converted i
2aac0 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
2aad0 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69  N.  If.  ** sqli
2aae0 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2aaf0 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64  hisSrc() is used
2ab00 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20   differently in 
2ab10 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a  the future, the.
2ab20 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c    ** NEVER() wil
2ab30 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d  l need to be rem
2ab40 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  oved. */.  if( p
2ab50 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
2ab60 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78  UMN || NEVER(pEx
2ab70 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
2ab80 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e  OLUMN) ){.    in
2ab90 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
2aba0 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57  SrcCount *p = pW
2abb0 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75  alker->u.pSrcCou
2abc0 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  nt;.    SrcList 
2abd0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
2abe0 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20  .    int nSrc = 
2abf0 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72  pSrc ? pSrc->nSr
2ac00 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  c : 0;.    for(i
2ac10 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29  =0; i<nSrc; i++)
2ac20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
2ac30 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  r->iTable==pSrc-
2ac40 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
2ac50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2ac60 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20   if( i<nSrc ){. 
2ac70 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b       p->nThis++;
2ac80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ac90 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20    p->nOther++;. 
2aca0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2acb0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2acc0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
2acd0 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ne if any of the
2ace0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
2acf0 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e  e pExpr Function
2ad00 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53   reference.** pS
2ad10 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  rcList.  Return 
2ad20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e  true if they do.
2ad30 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72    Also return tr
2ad40 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ue if the functi
2ad50 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67  on.** has no arg
2ad60 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e  uments or has on
2ad70 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ly constant argu
2ad80 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66  ments.  Return f
2ad90 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a  alse if pExpr.**
2ada0 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75   references colu
2adb0 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75  mns but not colu
2adc0 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f  mns of tables fo
2add0 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e  und in pSrcList.
2ade0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2adf0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2ae00 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  rc(Expr *pExpr, 
2ae10 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
2ae20 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
2ae30 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
2ae40 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  t cnt;.  assert(
2ae50 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2ae60 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
2ae70 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2ae80 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b   = exprSrcCount;
2ae90 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2aea0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  back = 0;.  w.u.
2aeb0 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
2aec0 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
2aed0 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
2aee0 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
2aef0 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
2af00 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
2af10 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
2af20 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
2af30 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
2af40 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
2af50 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
2af60 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
2af70 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2af80 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
2af90 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
2afa0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
2afb0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
2afc0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
2afd0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
2afe0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
2aff0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
2b000 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
2b010 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
2b020 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
2b030 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
2b040 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
2b050 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
2b060 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
2b070 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
2b080 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
2b090 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
2b0a0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
2b0b0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
2b0c0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
2b0d0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
2b0e0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2b0f0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
2b100 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
2b110 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
2b120 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
2b130 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
2b140 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
2b150 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
2b160 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
2b170 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
2b180 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
2b190 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
2b1a0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
2b1b0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
2b1c0 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
2b1d0 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
2b1e0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
2b1f0 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
2b200 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
2b210 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
2b220 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
2b230 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
2b240 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
2b250 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
2b260 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
2b270 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
2b280 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2b290 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
2b2a0 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
2b2b0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2b2c0 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
2b2d0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2b2e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
2b2f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
2b300 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2b310 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2b320 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
2b330 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
2b340 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
2b350 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
2b360 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
2b370 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
2b380 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
2b390 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
2b3a0 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
2b3b0 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
2b3c0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
2b3d0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
2b3e0 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
2b3f0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
2b400 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2b410 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
2b420 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
2b430 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2b440 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
2b450 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
2b460 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
2b470 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
2b480 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
2b490 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
2b4a0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
2b4b0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
2b4c0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
2b4d0 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
2b4e0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
2b4f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2b500 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
2b510 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
2b520 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
2b530 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
2b540 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2b550 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
2b560 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
2b570 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2b580 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2b590 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
2b5a0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2b5b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2b5c0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
2b5d0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
2b5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2b5f0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
2b600 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
2b610 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
2b620 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
2b630 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
2b640 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
2b650 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
2b660 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
2b670 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
2b680 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
2b690 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
2b6a0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
2b6b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
2b6c0 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
2b6d0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
2b6e0 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
2b6f0 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
2b700 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2b710 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
2b720 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
2b730 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
2b740 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
2b750 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
2b760 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
2b770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b780 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
2b790 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
2b7a0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
2b7b0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
2b7c0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
2b7d0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2b7e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b800 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b810 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
2b820 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2b830 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
2b840 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
2b850 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
2b860 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
2b870 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
2b880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b890 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
2b8a0 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
2b8b0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2b8c0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
2b8d0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
2b8e0 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
2b8f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
2b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2b910 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
2b920 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
2b930 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2b940 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
2b950 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
2b960 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2b970 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
2b980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2b990 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
2b9a0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2b9b0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
2b9c0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2b9e0 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
2b9f0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2ba00 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
2ba10 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
2ba20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2ba30 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2ba40 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba60 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
2ba90 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
2bab0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
2bac0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
2bad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2bae0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2baf0 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
2bb00 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
2bb30 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
2bb40 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2bb50 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2bb60 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
2bb70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2bb80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2bba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bbb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2bbc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2bbd0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
2bbe0 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2bc00 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2bc10 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
2bc20 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
2bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2bc40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2bc50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2bc60 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
2bc70 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
2bc80 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2bc90 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
2bca0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
2bcb0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
2bcc0 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
2bcd0 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
2bce0 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
2bcf0 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
2bd00 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
2bd10 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
2bd20 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
2bd30 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
2bd40 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
2bd50 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
2bd60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
2bd70 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2bd80 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2bd90 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
2bda0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
2bdb0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
2bdc0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2bdd0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
2bde0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
2bdf0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
2be00 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
2be10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2be20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
2be30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2be40 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
2be50 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
2be60 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
2be70 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
2be80 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2be90 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
2bea0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
2beb0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
2bec0 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
2bed0 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
2bee0 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
2bef0 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2bf00 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
2bf10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2bf20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2bf30 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
2bf40 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
2bf50 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
2bf60 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
2bf70 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
2bf80 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
2bf90 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
2bfa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2bfb0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2bfc0 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
2bfd0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
2bfe0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2bff0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2c000 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2c010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2c020 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2c030 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  e(0, pItem->pExp
2c040 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
2c050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c060 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2c070 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2c080 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
2c090 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
2c0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
2c0b0 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
2c0c0 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
2c0d0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
2c0e0 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
2c0f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
2c100 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
2c110 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
2c120 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
2c130 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
2c140 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
2c150 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
2c160 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2c170 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2c180 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2c190 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2c1a0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
2c1b0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
2c1c0 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
2c1d0 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
2c1e0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
2c1f0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
2c200 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2c210 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
2c220 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2c230 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2c240 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
2c250 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2c260 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
2c270 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
2c280 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
2c290 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2c2a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20  pr->u.zToken, . 
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2c0 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
2c2d0 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
2c2e0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
2c2f0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
2c300 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
2c310 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2c320 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2c330 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
2c340 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
2c350 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
2c360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c370 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
2c380 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
2c390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c3b0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
2c3c0 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
2c3d0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2c3e0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2c3f0 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
2c400 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2c410 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2c420 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2c430 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2c440 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
2c450 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2c460 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
2c470 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
2c480 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
2c490 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
2c4a0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
2c4b0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
2c4c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2c4d0 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ne;.      }else{
2c4e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c4f0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
2c500 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c510 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2c520 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
2c530 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
2c540 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
2c550 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
2c560 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2c570 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2c580 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
2c590 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
2c5a0 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  epth++;.  return
2c5b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2c5c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
2c5d0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2c5e0 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72  SelectEnd(Walker
2c5f0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2c600 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
2c610 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2c620 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c  pSelect);.  pWal
2c630 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2c640 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  --;.}../*.** Ana
2c650 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
2c660 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
2c670 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
2c680 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
2c690 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
2c6a0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
2c6b0 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
2c6c0 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
2c6d0 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
2c6e0 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
2c6f0 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
2c700 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
2c710 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
2c720 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
2c730 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2c740 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2c750 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
2c760 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
2c770 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
2c780 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
2c790 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
2c7a0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2c7b0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2c7c0 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
2c7d0 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
2c7e0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2c7f0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2c800 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2c810 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
2c820 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2c830 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2c840 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ect;.  w.xSelect
2c850 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c  Callback2 = anal
2c860 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2c870 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61  electEnd;.  w.wa
2c880 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20  lkerDepth = 0;. 
2c890 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
2c8a0 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
2c8b0 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
2c8c0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2c8d0 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
2c8e0 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
2c8f0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2c900 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
2c910 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
2c920 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
2c930 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
2c940 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2c950 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
2c960 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
2c970 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
2c980 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
2c990 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2c9a0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
2c9b0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
2c9c0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2c9d0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
2c9e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2c9f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
2ca00 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
2ca10 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
2ca20 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
2ca30 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
2ca40 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
2ca50 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2ca60 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
2ca70 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
2ca80 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2ca90 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
2caa0 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
2cab0 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
2cac0 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
2cad0 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
2cae0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2caf0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
2cb00 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
2cb10 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
2cb20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
2cb30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
2cb40 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
2cb50 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
2cb60 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
2cb70 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2cb80 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
2cb90 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
2cba0 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
2cbb0 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
2cbc0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  e..**.** If a re
2cbd0 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e  gister is curren
2cbe0 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62  tly being used b
2cbf0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
2cc00 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  he, then.** the 
2cc10 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  deallocation is 
2cc20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
2cc30 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
2cc40 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
2cc50 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
2cc60 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
2cc70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2cc80 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
2cc90 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2cca0 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
2ccb0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
2ccc0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
2ccd0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
2cce0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2ccf0 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
2cd00 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  che *p;.    for(
2cd10 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
2cd20 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
2cd30 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
2cd40 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
2cd50 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
2cd60 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
2cd70 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20  tempReg = 1;.   
2cd80 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2cd90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2cda0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2cdb0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2cdc0 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
2cdd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2cde0 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
2cdf0 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
2ce00 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
2ce10 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sters..*/.int sq
2ce20 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2ce30 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2ce40 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
2ce50 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52  t i, n;.  if( nR
2ce60 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73  eg==1 ) return s
2ce70 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2ce80 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20  (pParse);.  i = 
2ce90 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2cea0 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
2ceb0 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
2cec0 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
2ced0 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
2cee0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
2cef0 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
2cf00 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
2cf10 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
2cf20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2cf30 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
2cf40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
2cf50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2cf60 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2cf70 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
2cf80 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
2cf90 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2cfa0 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2cfb0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2cfc0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
2cfd0 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20  f( nReg==1 ){.  
2cfe0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2cff0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
2d000 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72  iReg);.    retur
2d010 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
2d020 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
2d030 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
2d040 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
2d050 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2d060 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
2d070 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
2d080 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
2d090 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
2d0a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
2d0b0 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  rk all temporary
2d0c0 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65   registers as be
2d0d0 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  ing unavailable 
2d0e0 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f  for reuse..*/.vo
2d0f0 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54  id sqlite3ClearT
2d100 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73  empRegCache(Pars
2d110 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
2d120 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
2d130 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52   0;.  pParse->nR
2d140 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a  angeReg = 0;.}..
2d150 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74  /*.** Validate t
2d160 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79  hat no temporary
2d170 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20   register falls 
2d180 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
2d190 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69   of.** iFirst..i
2d1a0 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e  Last, inclusive.
2d1b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2d1c0 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d  s only call from
2d1d0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
2d1e0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  .** statements..
2d1f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2d200 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
2d210 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65  e3NoTempsInRange
2d220 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2d230 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20  int iFirst, int 
2d240 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  iLast){.  int i;
2d250 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2d260 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26  RangeReg>0.   &&
2d270 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2d280 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg+pParse->nRang
2d290 65 52 65 67 20 3e 20 69 46 69 72 73 74 0a 20 20  eReg > iFirst.  
2d2a0 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2d2b0 67 65 52 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20  geReg <= iLast. 
2d2c0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
2d2d0 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
2d2e0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d  ; i<pParse->nTem
2d2f0 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pReg; i++){.    
2d300 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  if( pParse->aTem
2d310 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20  pReg[i]>=iFirst 
2d320 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  && pParse->aTemp
2d330 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b  Reg[i]<=iLast ){
2d340 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
2d350 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2d360 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
2d370 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
2d380 2a 2f 0a                                         */.