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

Artifact d99ee5eed7feca54fc43ccf98f082d209325970aca2f7df97ec9f4705a384725:


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: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
1230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  || op==TK_UPLUS 
1240: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
1250: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e  pLeft;.      con
1260: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1270: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   if( op==TK_COLL
1280: 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52  ATE || (op==TK_R
1290: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 6f 70  EGISTER && p->op
12a0: 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29  2==TK_COLLATE) )
12b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
12c0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
12d0: 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62  q(pParse, ENC(db
12e0: 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  ), 0, p->u.zToke
12f0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1310: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1320: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1330: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  MN.          || 
1340: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1350: 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45  || op==TK_TRIGGE
1360: 52 29 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 54  R).     && p->pT
1370: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1380: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1390: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
13a0: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
13b0: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
13c0: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
13d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
13e0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
13f0: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
1400: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
1410: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   */.      int j 
1420: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
1430: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
1440: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1450: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70  ar *zColl = p->p
1460: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1470: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ll;.        pCol
1480: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1490: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
14a0: 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
14b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20  t *pSelect, int 
57b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65  *pnHeight){.  Se
57c0: 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70  lect *p;.  for(p
57d0: 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70  =pSelect; p; p=p
57e0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68  ->pPrior){.    h
57f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5800: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5810: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5820: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5830: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5850: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5870: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5880: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5890: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
58a0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58d0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58e0: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
58f0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5900: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5910: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5920: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5930: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
5940: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
5950: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
5960: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
5970: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
5980: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
5990: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
59a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
59b0: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
59c0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
59d0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
59e0: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
59f0: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
5a00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5a10: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
5a20: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
5a30: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
5a40: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
5a50: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a70: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
5a80: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
5a90: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5aa0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
5ab0: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
5ac0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5ad0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
5ae0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
5af0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b00: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5b10: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5b20: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
5b30: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
5b40: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
5b50: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5b60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
5b70: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5b80: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
5b90: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
5ba0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
5bb0: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
5bc0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
5bd0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5bf0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
5c00: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
5c10: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
5c20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
5c30: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
5c40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
5c50: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5c70: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
5c80: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
5c90: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ca0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
5cb0: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
5cc0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5cd0: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
5ce0: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
5cf0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
5d00: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
5d10: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
5d20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
5d30: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
5d40: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
5d50: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
5d60: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
5d70: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
5d80: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5d90: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5da0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
5db0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5dc0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
5dd0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
5de0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
5df0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
5e00: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5e10: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5e20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5e30: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5e40: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5e50: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5e60: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
5e70: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
5e80: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5e90: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
5ea0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5eb0: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
5ec0: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
5ed0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5ee0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5ef0: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5f00: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5f20: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5f30: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5f40: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5f50: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
5f60: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
5f70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
5f80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
5f90: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5fa0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5fb0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5fc0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
5fd0: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
5fe0: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
5ff0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
6000: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
6010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6020: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
6030: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
6040: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
6050: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
6060: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
6070: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
6080: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
6090: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
60a0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
60b0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
60c0: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
60d0: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
60e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
60f0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
6100: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
6110: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
6120: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
6130: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
6140: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
6150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
6160: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
6170: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
6180: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
6190: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
61a0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
61b0: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
61c0: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
61d0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
61e0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
61f0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
6200: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
6210: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
6220: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
6230: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
6240: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
6250: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
6260: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
6270: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
6280: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
6290: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
62a0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
62b0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
62c0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
62d0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
62e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
62f0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
6300: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
6310: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
6320: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
6330: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
6340: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
6350: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
6360: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
6370: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
6380: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
6390: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
63a0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
63b0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
63c0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
63d0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
63e0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
63f0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
6400: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6410: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
6420: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6430: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6440: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6450: 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74  RawNN() */.  int
6460: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6470: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6480: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6490: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
64a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
64b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
64c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
64d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
64e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
64f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
6500: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
6510: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
6520: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
6530: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
6540: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
6550: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21  n ){.    if( op!
6560: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70  =TK_INTEGER || p
6570: 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20  Token->z==0.    
6580: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
6590: 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d  GetInt32(pToken-
65a0: 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20  >z, &iValue)==0 
65b0: 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
65c0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20  = pToken->n+1;. 
65d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61       assert( iVa
65e0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lue>=0 );.    }.
65f0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
6600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6610: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
6620: 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66  r)+nExtra);.  if
6630: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( pNew ){.    me
6640: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
6650: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
6660: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
6670: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
6680: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
6690: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
66a0: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
66b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
66c0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
66d0: 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20  alue|EP_Leaf;.  
66e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
66f0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6710: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6720: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6730: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6740: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6750: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6760: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6770: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6780: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6790: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
67a0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
67b0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
67c0: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
67d0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
67e0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
67f0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6800: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6810: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6820: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6830: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6840: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6850: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6860: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6870: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6890: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
68a0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
68b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
68c0: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
68d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
68e0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
68f0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6900: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6910: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6920: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6930: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6940: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6950: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6960: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6980: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6990: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
69a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
69b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
69d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
69e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
69f0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6a00: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6a10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a20: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6a30: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6a40: 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    x.n = sqlite3S
6a50: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b  trlen30(zToken);
6a60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6a70: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f  3ExprAlloc(db, o
6a80: 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p, &x, 0);.}../*
6a90: 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72  .** Attach subtr
6aa0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6ab0: 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72  ight to the Expr
6ac0: 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a   node pRoot..**.
6ad0: 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c  ** If pRoot==NUL
6ae0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  L that means tha
6af0: 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  t a memory alloc
6b00: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
6b10: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
6b20: 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74  that case, delet
6b30: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70  e the subtrees p
6b40: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
6b50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6b60: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6b70: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
6b80: 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74  b,.  Expr *pRoot
6b90: 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  ,.  Expr *pLeft,
6ba0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
6bb0: 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d  ){.  if( pRoot==
6bc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6bd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6be0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
6bf0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6c00: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
6c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c20: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6c30: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  e{.    if( pRigh
6c40: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6c50: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e  agate & pRight->
6c90: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
6ca0: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
6cb0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
6cc0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
6cd0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
6ce0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
6cf0: 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Left->flags;.   
6d00: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
6d10: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
6d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6d30: 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20  te an Expr node 
6d40: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
6d50: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
6d60: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
6d70: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
6d80: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
6d90: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
6da0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
6db0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
6dc0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
6dd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
6de0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6df0: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
6e00: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
6e10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
6e20: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6e30: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
6e40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
6e50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6e60: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6e90: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
6ea0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
6eb0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
6ec0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
6ed0: 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20  ight            
6ee0: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
6ef0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6f00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
6f10: 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  ND && pParse->nE
6f20: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rr==0 ){.    /* 
6f30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6f40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6f50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6f60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6fc0: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6fd0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6fe0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6ff0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
7000: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
7010: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
7020: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
7030: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
7040: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
7050: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
7060: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7070: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7080: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7090: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
70a0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
70b0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
70c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
70d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
70e0: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
70f0: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7100: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
7110: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
7120: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
7130: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
7140: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
7150: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
7160: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7170: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7180: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7190: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
71a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
71b0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
71c0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
71d0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
71e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
71f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7200: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
7210: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
7220: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
7230: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
7240: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
7250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7270: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7280: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7290: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
72a0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
72b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
72c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
72d0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
72e0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
72f0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7300: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
7310: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7320: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
7330: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
7340: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
7350: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
7360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7370: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7380: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7390: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
73a0: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
73b0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
73c0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
73d0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
73e0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
73f0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7400: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
7410: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
7420: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
7430: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
7440: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
7450: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
7460: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7470: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7480: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7490: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
74a0: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
74b0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
74c0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
74d0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
74e0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
74f0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7500: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
7510: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
7520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7530: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
7540: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7550: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7560: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7570: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7580: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7590: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
75a0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
75b0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
75c0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
75d0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
75e0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
75f0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7610: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7630: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7640: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7660: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7670: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7680: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7690: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
76a0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
76b0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
76c0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
76d0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
76e0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
76f0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7700: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
7710: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7720: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
7730: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
7740: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
7750: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
7760: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7770: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7780: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7790: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
77a0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
77b0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
77c0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
77d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
77e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
77f0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7800: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
7820: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
7830: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7840: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
7850: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
7860: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7870: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7880: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7890: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
78a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
78b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
78c0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
78d0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
78e0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
78f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7900: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7910: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7920: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
7930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7940: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
7950: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
7960: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7970: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7980: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7990: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
79a0: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
79b0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
79c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
79d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
79e0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
79f0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
7a00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
7a10: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
7a20: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
7a30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a40: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
7a50: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
7a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
7a70: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
7a80: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
7a90: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7ab0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7ac0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
7ad0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
7ae0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
7af0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
7b00: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
7b10: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45  ist = pList;.  E
7b20: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7b30: 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29  New, EP_HasFunc)
7b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7b50: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7b60: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7b70: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7b80: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7b90: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7ba0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7bc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7bd0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7be0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7bf0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7c00: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7c10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7c20: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c30: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7c40: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7c50: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7c60: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
7c70: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
7c80: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7ca0: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7cb0: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
7cc0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7cd0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7ce0: 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64  too big to avoid
7cf0: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
7d00: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
7d10: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
7d20: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
7d30: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
7d40: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
7d50: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
7d60: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
7d70: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
7d80: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
7d90: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
7da0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
7db0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
7dc0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
7dd0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
7de0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
7df0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
7e00: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7e10: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
7e20: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
7e30: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7e40: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
7e50: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
7e60: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7e70: 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c  r, u32 n){.  sql
7e80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7e90: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
7ea0: 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20  har *z;.  ynVar 
7eb0: 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  x;..  if( pExpr=
7ec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
7ed0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
7ee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7ef0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
7f00: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7f10: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7f20: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7f30: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7f40: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7f50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
7f60: 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74  ==(u32)sqlite3St
7f70: 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69  rlen30(z) );.  i
7f80: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[1]==0 ){.  
7f90: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
7fa0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
7fb0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
7fc0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7fd0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
7fe0: 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20  [0]=='?' );.    
7ff0: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
8000: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d  arse->nVar);.  }
8010: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f  else{.    int do
8020: 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Add = 0;.    if(
8030: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
8040: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
8050: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
8060: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
8070: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
8080: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
8090: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
80a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
80b0: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
80c0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20    int bOk;.     
80d0: 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f   if( n==2 ){ /*O
80e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54  PTIMIZATION-IF-T
80f0: 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20  RUE*/.        i 
8100: 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20  = z[1]-'0';  /* 
8110: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
8120: 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67  of ?N for a sing
8130: 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20  le digit N */.  
8140: 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
8150: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8160: 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c      bOk = 0==sql
8170: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
8180: 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54  , &i, n-1, SQLIT
8190: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
81a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81b0: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   i==0 );.      t
81c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
81d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81e0: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
81f0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8200: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29  ABLE_NUMBER]-1 )
8210: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8220: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
8230: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8240: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
8250: 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  .      if( bOk==
8260: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
8270: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8280: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8290: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
82a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
82b0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
82c0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
82d0: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
82e0: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
82f0: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
8300: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8310: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
8320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
8330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d       }.      x =
8340: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
8350: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
8360: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
8370: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
8380: 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f  nt)x;.        do
8390: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
83a0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
83b0: 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
83c0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78  Parse->pVList, x
83d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
83e0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
83f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8400: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
8410: 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24   like ":aaa", "$
8420: 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20  aaa" or "@aaa". 
8430: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
8440: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
8450: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
8460: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
8470: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
8480: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
8490: 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  e.      ** has n
84a0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
84b0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
84c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
84d0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mber.      */.  
84e0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73      x = (ynVar)s
84f0: 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54  qlite3VListNameT
8500: 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c  oNum(pParse->pVL
8510: 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ist, z, n);.    
8520: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
8530: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8540: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8550: 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  );.        doAdd
8560: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8570: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64    }.    if( doAd
8580: 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  d ){.      pPars
8590: 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69  e->pVList = sqli
85a0: 74 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20  te3VListAdd(db, 
85b0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
85c0: 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a  z, n, x);.    }.
85d0: 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f    }.  pExpr->iCo
85e0: 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20  lumn = x;.  if( 
85f0: 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  x>db->aLimit[SQL
8600: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8610: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8620: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8630: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8640: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8650: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8660: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
8670: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
8680: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
8690: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
86a0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
86b0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
86c0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
86d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
86e0: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
86f0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8700: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8710: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8720: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8730: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8740: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8750: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8760: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
8770: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8780: 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48  EBUG.  if( ExprH
8790: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87a0: 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48  _Leaf) && !ExprH
87b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
87d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
87e0: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eft==0 );.    as
87f0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8810: 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  ( p->x.pSelect==
8820: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
8830: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8840: 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f  operty(p, (EP_To
8850: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
8860: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
8870: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
8880: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
8890: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
88a0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
88b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
88c0: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
88d0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
88e0: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70  f( p->pLeft && p
88f0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op!=TK_SELECT_
8900: 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33  COLUMN ) sqlite3
8910: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8920: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
8930: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
8940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8950: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8960: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8970: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
8980: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8990: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
89a0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
89b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
89c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
89d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
89e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
89f0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8a00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8a10: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8a20: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
8a30: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
8a40: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
8a50: 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  n);.  if( !ExprH
8a60: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8a70: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
8a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
8a90: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
8aa0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
8ab0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
8ac0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
8ad0: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
8ae0: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
8af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8b00: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8b10: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
8b20: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
8b30: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
8b40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8b50: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8b60: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
8b70: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
8b80: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
8b90: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
8ba0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
8bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
8bc0: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8bd0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
8be0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8bf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
8c00: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
8c10: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
8c20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8c30: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
8c40: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
8c50: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
8c60: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
8c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
8c80: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
8c90: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
8ca0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8cb0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
8cc0: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
8cd0: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
8ce0: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
8cf0: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
8d00: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
8d10: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
8d20: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
8d30: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
8d40: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
8d50: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
8d60: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8d70: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
8d80: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
8d90: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
8da0: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
8db0: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
8dc0: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
8dd0: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
8de0: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
8df0: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8e50: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8e60: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
8e70: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
8e80: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
8e90: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
8ea0: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
8eb0: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
8ec0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
8ed0: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
8ee0: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
8ef0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
8f00: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
8f10: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
8f20: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
8f30: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
8f40: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
8f50: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
8f60: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
8f70: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
8f80: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
8f90: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
8fa0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
8fb0: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
8fc0: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
8fd0: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
8fe0: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
8ff0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
9000: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
9010: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
9020: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
9030: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
9040: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
9050: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
9060: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
9070: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9080: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
9090: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
90a0: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
90b0: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
90c0: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
90d0: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
90e0: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
90f0: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
9100: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
9110: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
9120: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
9130: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
9140: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
9150: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
9160: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
9170: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
9180: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
9190: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
91a0: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
91b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
91c0: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
91d0: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
91e0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
91f0: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
9200: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
9210: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
9220: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
9230: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
9240: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
9250: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
9260: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
9270: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
9280: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
9290: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
92a0: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
92b0: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
92c0: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
92d0: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
92e0: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
92f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9300: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9310: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
9320: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
9330: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
9340: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
9350: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
9360: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
9370: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
9380: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
9390: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
93a0: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
93b0: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
93c0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
93d0: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
93e0: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20  if( 0==flags || 
93f0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
9400: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e  _COLUMN ){.    n
9410: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
9420: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
9430: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9440: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9450: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
9460: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
9470: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9480: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
9490: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
94a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
94c0: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
94d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
94f0: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9500: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9510: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
9520: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9530: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
9540: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
9550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9560: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9570: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
9580: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
9590: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
95a0: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
95b0: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
95c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
95d0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
95e0: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
95f0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9600: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9610: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9620: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
9630: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
9640: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
9650: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
9660: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
9670: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9680: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
9690: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
96a0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
96b0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
96c0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
96d0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
96e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
96f0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9700: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9710: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
9720: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9730: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
9740: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
9750: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
9760: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9770: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
9780: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
9790: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
97a0: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
97b0: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
97c0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
97d0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
97e0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
97f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
9800: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
9810: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
9820: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
9830: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
9840: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9850: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
9860: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
9870: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
9880: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
9890: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
98a0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
98b0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
98c0: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
98d0: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
98e0: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
98f0: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
9900: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
9910: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
9920: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
9930: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
9940: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
9950: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
9960: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
9970: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
9980: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
9990: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
99a0: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
99b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
99c0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
99d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
99e0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
99f0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
9a00: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
9a10: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
9a20: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
9a30: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
9a40: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
9a50: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
9a60: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
9a70: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
9a80: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
9a90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
9aa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
9ab0: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  te;.}../*.** Thi
9ac0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
9ad0: 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
9ae0: 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70  ExprDup(), excep
9af0: 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66  t that if pzBuff
9b00: 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55  er .** is not NU
9b10: 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65  LL then *pzBuffe
9b20: 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
9b30: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
9b40: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a  r large enough .
9b50: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
9b60: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
9b70: 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73  on p, the copies
9b80: 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a   of p->u.zToken.
9b90: 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ** (if applicabl
9ba0: 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69  e), and the copi
9bb0: 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65  es of the p->pLe
9bc0: 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74  ft and p->pRight
9bd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
9be0: 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20   if any. Before 
9bf0: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75  returning, *pzBu
9c00: 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74  ffer is set to t
9c10: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
9c20: 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f  st the.** portio
9c30: 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  n of the buffer 
9c40: 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74  copied into by t
9c50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
9c60: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78  .static Expr *ex
9c70: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
9c80: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
9c90: 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70  dupFlags, u8 **p
9ca0: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
9cb0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
9cc0: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
9cd0: 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41  turn */.  u8 *zA
9ce0: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
9cf0: 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
9d00: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75  from which to bu
9d10: 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ild Expr object 
9d20: 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63 46  */.  u32 staticF
9d30: 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50  lag;       /* EP
9d40: 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63 65  _Static if space
9d50: 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72   not obtained fr
9d60: 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20  om malloc */..  
9d70: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
9d80: 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
9d90: 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c 61    assert( dupFla
9da0: 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  gs==0 || dupFlag
9db0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
9dc0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9dd0: 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75  zBuffer==0 || du
9de0: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
9df0: 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20  REDUCE );..  /* 
9e00: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
9e10: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
9e20: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
9e30: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66  . */.  if( pzBuf
9e40: 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f  fer ){.    zAllo
9e50: 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20  c = *pzBuffer;. 
9e60: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9e70: 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c  EP_Static;.  }el
9e80: 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  se{.    zAlloc =
9e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9ea0: 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45  RawNN(db, dupedE
9eb0: 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  xprSize(p, dupFl
9ec0: 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69  ags));.    stati
9ed0: 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  cFlag = 0;.  }. 
9ee0: 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29   pNew = (Expr *)
9ef0: 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70  zAlloc;..  if( p
9f00: 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  New ){.    /* Se
9f10: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
9f20: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
9f30: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
9f40: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
9f50: 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68    ** by pNew. Th
9f60: 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50  is is either EXP
9f70: 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52  R_FULLSIZE, EXPR
9f80: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a  _REDUCEDSIZE or.
9f90: 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45      ** EXPR_TOKE
9fa0: 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65  NONLYSIZE. nToke
9fb0: 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
9fc0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9fd0: 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20  consumed.    ** 
9fe0: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
9ff0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
a000: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
a010: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
a020: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
a030: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
a040: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64  rStructSize(p, d
a050: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f  upFlags);.    co
a060: 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  nst int nNewSize
a070: 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26   = nStructSize &
a080: 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20   0xfff;.    int 
a090: 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20  nToken;.    if( 
a0a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a0b0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
a0c0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
a0d0: 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  ){.      nToken 
a0e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a0f0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
a100: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
a110: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b       nToken = 0;
a120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
a130: 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  upFlags ){.     
a140: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
a150: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
a160: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
a170: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a180: 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b  c, p, nNewSize);
a190: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a1a0: 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75    u32 nSize = (u
a1b0: 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a  32)exprStructSiz
a1c0: 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  e(p);.      memc
a1d0: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53  py(zAlloc, p, nS
a1e0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
a1f0: 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53  nSize<EXPR_FULLS
a200: 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20  IZE ){ .        
a210: 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e  memset(&zAlloc[n
a220: 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46  Size], 0, EXPR_F
a230: 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a  ULLSIZE-nSize);.
a240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a250: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
a260: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
a270: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
a280: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
a290: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
a2a0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
a2b0: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
a2c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
a2d0: 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e  atic|EP_MemToken
a2e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
a2f0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
a300: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
a310: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
a320: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
a330: 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20  = staticFlag;.. 
a340: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
a350: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
a360: 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  g, if any. */.  
a370: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
a380: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
a390: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
a3a0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
a3b0: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
a3c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f        memcpy(zTo
a3d0: 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken, p->u.zToken
a3e0: 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  , nToken);.    }
a3f0: 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70  ..    if( 0==((p
a400: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
a410: 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e  ags) & (EP_Token
a420: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29  Only|EP_Leaf)) )
a430: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  {.      /* Fill 
a440: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
a450: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
a460: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
a470: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
a480: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a490: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
a4a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a4b0: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
a4c0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
a4d0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75  p->x.pSelect, du
a4e0: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  pFlags);.      }
a4f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
a500: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
a510: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a520: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
a530: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a540: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
a550: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
a560: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
a570: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69  pRight. */.    i
a580: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a590: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
a5a0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a5b0: 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  ) ){.      zAllo
a5c0: 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  c += dupedExprNo
a5d0: 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  deSize(p, dupFla
a5e0: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gs);.      if( !
a5f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a600: 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  pNew, EP_TokenOn
a610: 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20  ly|EP_Leaf) ){. 
a620: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
a630: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a  ft = p->pLeft ?.
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a660: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
a670: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a680: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a690: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a6a0: 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20   p->pRight ?.   
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
a6d0: 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44  p->pRight, EXPRD
a6e0: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a6f0: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  oc) : 0;.      }
a700: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66  .      if( pzBuf
a710: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  fer ){.        *
a720: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
a730: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
a740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
a750: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a760: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
a770: 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20  |EP_Leaf) ){.   
a780: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a790: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a7a0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a7b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a7c0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a7d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43     assert( p->iC
a7e0: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70  olumn==0 || p->p
a7f0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
a800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a810: 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70  >pRight==0  || p
a820: 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65  ->pRight==p->pLe
a830: 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ft );.        }e
a840: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
a850: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
a860: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a870: 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  p->pLeft, 0);.  
a880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a890: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
a8a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a8b0: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  , p->pRight, 0);
a8c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a8d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
a8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
a8f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
a900: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
a910: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
a920: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
a930: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
a940: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
a950: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
a960: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
a970: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
a980: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
a990: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
a9a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
a9b0: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
a9c0: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
a9d0: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
a9e0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
a9f0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
aa00: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
aa10: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
aa20: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
aa30: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
aa40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
aa50: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
aa60: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
aa70: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
aa80: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
aa90: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
aaa0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
aab0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
aac0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
aad0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
aae0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
aaf0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
ab00: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ab10: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
ab20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
ab30: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
ab40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
ab50: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
ab60: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ab70: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
ab80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
ab90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
aba0: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
abb0: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
abc0: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
abd0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
abe0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
abf0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
ac00: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
ac10: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
ac20: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
ac30: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
ac40: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
ac50: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
ac60: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
ac70: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
ac80: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
ac90: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
aca0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
acb0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
acc0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
acd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
ace0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
acf0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
ad00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ad10: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
ad20: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
ad30: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
ad40: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
ad50: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
ad60: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
ad70: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
ad80: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
ad90: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
ada0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
adb0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
adc0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
add0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
ade0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
adf0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
ae00: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
ae10: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
ae20: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
ae30: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
ae40: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
ae50: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
ae60: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
ae70: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
ae80: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
ae90: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
aea0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
aeb0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
aec0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
aed0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
aee0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
aef0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
af00: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
af10: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
af20: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
af30: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
af40: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
af50: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
af60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
af70: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
af80: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
af90: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
afa0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
afb0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
afc0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
afd0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
afe0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
aff0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b000: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
b010: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
b020: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
b030: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
b040: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b050: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b060: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b070: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b080: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b090: 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20  Size(db, p));.  
b0a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b0b0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b0c0: 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72  nExpr = p->nExpr
b0d0: 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77  ;.  pItem = pNew
b0e0: 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20  ->a;.  pOldItem 
b0f0: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
b100: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
b110: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
b120: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
b130: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
b140: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
b150: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b160: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
b170: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b180: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
b190: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
b1a0: 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20  if( pOldExpr .  
b1b0: 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e     && pOldExpr->
b1c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
b1d0: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e  LUMN.     && (pN
b1e0: 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  ewExpr = pItem->
b1f0: 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29  pExpr)!=0 .    )
b200: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b210: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b220: 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20  n==0 || i>0 );. 
b230: 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70       if( pNewExp
b240: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
b250: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b260: 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74   pOldExpr->pLeft
b270: 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67  ==pOldExpr->pRig
b280: 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ht );.        pP
b290: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
b2a0: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b2b0: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67  = pNewExpr->pRig
b2c0: 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ht;.      }else{
b2d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b2e0: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   i>0 );.        
b2f0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31  assert( pItem[-1
b300: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
b310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
b320: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b330: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
b340: 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ->iColumn+1 );. 
b350: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b360: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d  PriorSelectCol==
b370: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b380: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
b390: 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66    pNewExpr->pLef
b3a0: 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74  t = pPriorSelect
b3b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
b3c0: 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e   }.    pItem->zN
b3d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b3e0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b3f0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b400: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
b410: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b420: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
b430: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
b440: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
b450: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
b460: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
b470: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
b480: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
b490: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
b4a0: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62  ab;.    pItem->b
b4b0: 53 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64  SorterRef = pOld
b4c0: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
b4d0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
b4e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
b4f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
b500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
b510: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
b520: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
b530: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
b540: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
b550: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
b560: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
b570: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
b580: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
b590: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
b5a0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
b5b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b5c0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
b5d0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
b5e0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
b5f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
b600: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
b610: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
b620: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
b630: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
b640: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
b650: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
b660: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
b670: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
b680: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
b690: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
b6a0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
b6b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
b6c0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
b6d0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b6e0: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
b6f0: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
b700: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
b710: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
b720: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
b730: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
b740: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b750: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
b760: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
b770: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
b780: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
b790: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
b7a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
b7b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
b7c0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b7d0: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
b7e0: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
b7f0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b800: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
b810: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
b820: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
b830: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
b840: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
b850: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
b860: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
b870: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b880: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
b890: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
b8a0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b8b0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b8c0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b8d0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b8e0: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
b8f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b900: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
b910: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66  .    pNewItem->f
b920: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67  g = pOldItem->fg
b930: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b940: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
b950: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
b960: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
b970: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
b980: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
b990: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
b9a0: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
b9b0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
b9c0: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
b9d0: 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
b9e0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
b9f0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
ba00: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
ba10: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
ba20: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
ba30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
ba40: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  tem->pIBIndex = 
ba50: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pOldItem->pIBInd
ba60: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ex;.    if( pNew
ba70: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
ba80: 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nc ){.      pNew
ba90: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
baa0: 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  g = .          s
bab0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bac0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bad0: 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61  u1.pFuncArg, fla
bae0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  gs);.    }.    p
baf0: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
bb00: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
bb10: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
bb20: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
bb30: 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
bb40: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
bb50: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
bb60: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
bb70: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
bb80: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
bb90: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
bba0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
bbb0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
bbc0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bbd0: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
bbe0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
bbf0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bc00: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
bc10: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
bc20: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
bc30: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
bc40: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
bc50: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
bc60: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
bc70: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
bc80: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
bc90: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
bca0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
bcb0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
bcc0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
bcd0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
bce0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
bcf0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
bd00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
bd10: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
bd20: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
bd30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
bd40: 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  N(db, p->nId*siz
bd50: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
bd60: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
bd70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
bd80: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77  bFreeNN(db, pNew
bd90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
bda0: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  .  }.  /* Note t
bdb0: 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20  hat because the 
bdc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
bdd0: 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b  cation for p->a[
bde0: 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  ] is not.  ** ne
bdf0: 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65  cessarily a powe
be00: 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65  r of two, sqlite
be10: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20  3IdListAppend() 
be20: 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
be30: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75  d.  ** on the du
be40: 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20  plicate created 
be50: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
be60: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
be70: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
be80: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
be90: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
bea0: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
beb0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
bec0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
bed0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
bee0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
bef0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
bf00: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bf10: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
bf20: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
bf30: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
bf40: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
bf50: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
bf60: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
bf70: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
bf80: 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Dup, int flags){
bf90: 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20  .  Select *pRet 
bfa0: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  = 0;.  Select *p
bfb0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65  Next = 0;.  Sele
bfc0: 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b  ct **pp = &pRet;
bfd0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20  .  Select *p;.. 
bfe0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
bff0: 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20  ;.  for(p=pDup; 
c000: 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b  p; p=p->pPrior){
c010: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
c020: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
c030: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c040: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69  eof(*p) );.    i
c050: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65  f( pNew==0 ) bre
c060: 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45  ak;.    pNew->pE
c070: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
c080: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c090: 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b  >pEList, flags);
c0a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  .    pNew->pSrc 
c0b0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
c0c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c  Dup(db, p->pSrc,
c0d0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c0e0: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
c0f0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c100: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
c110: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f  ;.    pNew->pGro
c120: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
c130: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c140: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
c150: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61  );.    pNew->pHa
c160: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
c170: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
c180: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
c190: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
c1a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c1b0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
c1c0: 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  derBy, flags);. 
c1d0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d     pNew->op = p-
c1e0: 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  >op;.    pNew->p
c1f0: 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  Next = pNext;.  
c200: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
c210: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c   0;.    pNew->pL
c220: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
c230: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
c240: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  mit, flags);.   
c250: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
c260: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66  0;.    pNew->iOf
c270: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
c280: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
c290: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
c2a0: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
c2b0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
c2c0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
c2d0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
c2e0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
c2f0: 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63      pNew->nSelec
c300: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
c310: 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  tRow;.    pNew->
c320: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
c330: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20  db, p->pWith);. 
c340: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c350: 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d  SetName(pNew, p-
c360: 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  >zSelName);.    
c370: 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  *pp = pNew;.    
c380: 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69  pp = &pNew->pPri
c390: 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  or;.    pNext = 
c3a0: 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pNew;.  }..  ret
c3b0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73  urn pRet;.}.#els
c3c0: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
c3d0: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
c3e0: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
c3f0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
c400: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
c410: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
c420: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
c430: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
c440: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
c450: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c460: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
c470: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
c480: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
c490: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
c4a0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ist..**.** The p
c4b0: 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75  List argument mu
c4c0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 55 4c  st be either NUL
c4d0: 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74  L or a pointer t
c4e0: 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a 2a  o an ExprList.**
c4f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
c500: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
c510: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c520: 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20 72 6f  pend().  This ro
c530: 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74  utine.** may not
c540: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
c550: 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61 69 6e   ExprList obtain
c560: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45  ed from sqlite3E
c570: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
c580: 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73 20 72   Reason:  This r
c590: 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20 74  outine assumes t
c5a0: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
c5b0: 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73 74  f slots in pList
c5c0: 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70 6f  ->a[].** is a po
c5d0: 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54 68 61  wer of two.  Tha
c5e0: 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 73 71  t is true for sq
c5f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
c600: 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a 2a 2a  end() returns.**
c610: 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65 63 65   but is not nece
c620: 73 73 61 72 69 6c 79 20 74 72 75 65 20 66 72 6f  ssarily true fro
c630: 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  m the return val
c640: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45 78 70  ue of sqlite3Exp
c650: 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a  rListDup()..**.*
c660: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
c670: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
c680: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
c690: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
c6a0: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
c6b0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
c6c0: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
c6d0: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
c6e0: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
c6f0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
c700: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
c710: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
c720: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
c730: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
c740: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c750: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c760: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c770: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c780: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
c790: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
c7a0: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
c7b0: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
c7c0: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
c7d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
c7e0: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
c7f0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
c800: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
c810: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
c820: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c830: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
c840: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c850: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
c860: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
c870: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c880: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
c890: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
c8a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
c8b0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
c8c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
c8d0: 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d  ->nExpr = 0;.  }
c8e0: 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d  else if( (pList-
c8f0: 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d  >nExpr & (pList-
c900: 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b  >nExpr-1))==0 ){
c910: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
c920: 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
c930: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
c940: 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20  (db, pList, .   
c950: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
c960: 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69 73  (*pList)+(2*pLis
c970: 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a 73 69  t->nExpr - 1)*si
c980: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c990: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
c9a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
c9b0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
c9c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
c9d0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
c9e0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
c9f0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73  >nExpr++];.  ass
ca00: 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74  ert( offsetof(st
ca10: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ca20: 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f  em,zName)==sizeo
ca30: 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20  f(pItem->pExpr) 
ca40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
ca50: 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70  setof(struct Exp
ca60: 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70 72  rList_item,pExpr
ca70: 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  )==0 );.  memset
ca80: 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30  (&pItem->zName,0
ca90: 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d  ,sizeof(*pItem)-
caa0: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
cab0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e  ExprList_item,zN
cac0: 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  ame));.  pItem->
cad0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
cae0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
caf0: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
cb00: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
cb10: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
cb20: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
cb30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
cb40: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
cb50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
cb60: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
cb70: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
cb80: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e  }../*.** pColumn
cb90: 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d  s and pExpr form
cba0: 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e   a vector assign
cbb0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61  ment which is pa
cbc0: 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a  rt of the SET.**
cbd0: 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50   clause of an UP
cbe0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  DATE statement. 
cbf0: 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
cc00: 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29  *        (a,b,c)
cc10: 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c   = (expr1,expr2,
cc20: 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20  expr3).** Or:   
cc30: 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45   (a,b,c) = (SELE
cc40: 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e  CT x,y,z FROM ..
cc50: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ..).**.** For ea
cc60: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76  ch term of the v
cc70: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
cc80: 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74  , append new ent
cc90: 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65  ries to the.** e
cca0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
ccb0: 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61  List.  In the ca
ccc0: 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79  se of a subquery
ccd0: 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70   on the RHS, app
cce0: 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54  end.** TK_SELECT
ccf0: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
cd00: 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ons..*/.ExprList
cd10: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
cd20: 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20  tAppendVector(. 
cd30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cd40: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
cd50: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
cd60: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
cd70: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
cd80: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
cd90: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
cda0: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
cdb0: 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20  olumns,      /* 
cdc0: 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66  List of names of
cdd0: 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69   LHS of the assi
cde0: 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  gnment */.  Expr
cdf0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
ce00: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70     /* Vector exp
ce10: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
ce20: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
ce30: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
ce40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ce50: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b  se->db;.  int n;
ce60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
ce70: 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f  iFirst = pList ?
ce80: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
ce90: 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73  0;.  /* pColumns
cea0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c   can only be NUL
ceb0: 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20  L due to an OOM 
cec0: 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20  but an OOM will 
ced0: 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78  cause an.  ** ex
cee0: 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  it prior to this
cef0: 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69   routine being i
cf00: 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20  nvoked */.  if( 
cf10: 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d  NEVER(pColumns==
cf20: 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72  0) ) goto vector
cf30: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
cf40: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
cf50: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
cf60: 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  nd_error;..  /* 
cf70: 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
cf80: 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20  vector, then we 
cf90: 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  can immediately 
cfa0: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
cfb0: 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  t .  ** the size
cfc0: 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64 20   of the RHS and 
cfd0: 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20  LHS match.  But 
cfe0: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  if the RHS is a 
cff0: 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69  SELECT, .  ** wi
d000: 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e  ldcards ("*") in
d010: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d020: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75  of the SELECT mu
d030: 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
d040: 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61  efore.  ** we ca
d050: 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68  n do the size ch
d060: 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68  eck, so defer th
d070: 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74  e size check unt
d080: 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
d090: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
d0a0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  Expr->op!=TK_SEL
d0b0: 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d  ECT && pColumns-
d0c0: 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33  >nId!=(n=sqlite3
d0d0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
d0e0: 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71  Expr)) ){.    sq
d0f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d100: 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
d110: 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
d120: 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
d130: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75             pColu
d140: 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20  mns->nId, n);.  
d150: 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70    goto vector_ap
d160: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  pend_error;.  }.
d170: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
d180: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b  olumns->nId; i++
d190: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75  ){.    Expr *pSu
d1a0: 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  bExpr = sqlite3E
d1b0: 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c  xprForVectorFiel
d1c0: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
d1d0: 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   i);.    pList =
d1e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d1f0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
d200: 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b  List, pSubExpr);
d210: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
d220: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d230: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46  pList->nExpr==iF
d240: 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20  irst+i+1 );.    
d250: 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
d260: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
d270: 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69   = pColumns->a[i
d280: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ].zName;.      p
d290: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
d2a0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
d2b0: 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   }..  if( !db->m
d2c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70  allocFailed && p
d2d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
d2e0: 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70 4c  ECT && ALWAYS(pL
d2f0: 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 45  ist!=0) ){.    E
d300: 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70 4c  xpr *pFirst = pL
d310: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70  ist->a[iFirst].p
d320: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
d330: 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a 20  ( pFirst!=0 );. 
d340: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73     assert( pFirs
d350: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  t->op==TK_SELECT
d360: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
d370: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
d380: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
d390: 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20  nt in pRight so 
d3a0: 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  it will be delet
d3b0: 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73  ed when.    ** s
d3c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
d3d0: 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lete() is called
d3e0: 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e   */.    pFirst->
d3f0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a  pRight = pExpr;.
d400: 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a      pExpr = 0;..
d410: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
d420: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d430: 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f  LHS in iTable so
d440: 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 65   that we can che
d450: 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ck that.    ** t
d460: 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73  he RHS and LHS s
d470: 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e  izes match durin
d480: 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
d490: 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  n. */.    pFirst
d4a0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75  ->iTable = pColu
d4b0: 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76  mns->nId;.  }..v
d4c0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
d4d0: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  or:.  sqlite3Exp
d4e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
d4f0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  r);.  sqlite3IdL
d500: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
d510: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72  olumns);.  retur
d520: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
d530: 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f  * Set the sort o
d540: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73  rder for the las
d550: 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65  t element on the
d560: 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e   given ExprList.
d570: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d580: 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
d590: 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70  rder(ExprList *p
d5a0: 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72  , int iSortOrder
d5b0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
d5c0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
d5d0: 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45  ( SQLITE_SO_UNDE
d5e0: 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54  FINED<0 && SQLIT
d5f0: 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53  E_SO_ASC>=0 && S
d600: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20  QLITE_SO_DESC>0 
d610: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d620: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28  nExpr>0 );.  if(
d630: 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b   iSortOrder<0 ){
d640: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d650: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
d660: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
d670: 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65  SO_ASC );.    re
d680: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61  turn;.  }.  p->a
d690: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
d6a0: 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f  tOrder = (u8)iSo
d6b0: 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rtOrder;.}../*.*
d6c0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
d6d0: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
d6e0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
d6f0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
d700: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
d710: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
d720: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
d730: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
d740: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
d750: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
d760: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
d770: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
d780: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
d790: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
d7a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
d7b0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
d7c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d7d0: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
d7e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d7f0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
d800: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d810: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
d820: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
d830: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
d840: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
d850: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
d860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
d870: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
d880: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
d890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d8a0: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
d8b0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
d8c0: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
d8d0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
d8e0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
d8f0: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
d900: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d910: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
d920: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
d930: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d940: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
d950: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
d960: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d970: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
d980: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
d990: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
d9a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
d9b0: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
d9c0: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
d9d0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
d9e0: 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74   dequote ) sqlit
d9f0: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
da00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  >zName);.  }.}..
da10: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
da20: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e  prList.a[].zSpan
da30: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
da40: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
da50: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
da60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
da70: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
da80: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
da90: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
daa0: 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e  rror.  But pSpan
dab0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
dac0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
dad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
dae0: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
daf0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
db00: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
db10: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
db20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
db30: 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Span(.  Parse *p
db40: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
db50: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
db60: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
db70: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
db80: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
db90: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
dba0: 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  . */.  const cha
dbb0: 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 2f  r *zStart,     /
dbc0: 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 73  * Start of the s
dbd0: 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  pan */.  const c
dbe0: 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20  har *zEnd       
dbf0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73   /* End of the s
dc00: 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  pan */.){.  sqli
dc10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
dc20: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
dc30: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
dc40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
dc50: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
dc60: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
dc70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
dc80: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
dc90: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
dca0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
dcb0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
dcc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dcd0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
dce0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
dcf0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70  an = sqlite3DbSp
dd00: 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74  anDup(db, zStart
dd10: 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  , zEnd);.  }.}..
dd20: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
dd30: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
dd40: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
dd50: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
dd60: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
dd70: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
dd80: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
dd90: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
dda0: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
ddb0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ddc0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
ddd0: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
dde0: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
ddf0: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
de00: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
de10: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
de20: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
de30: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
de40: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
de50: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
de60: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
de70: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
de80: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
de90: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
dea0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
deb0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
dec0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
ded0: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
dee0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
def0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
df00: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
df10: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
df20: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
df30: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
df40: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
df50: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
df60: 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt i = pList->nE
df70: 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78  xpr;.  struct Ex
df80: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
df90: 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a  em =  pList->a;.
dfa0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
dfb0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f  >nExpr>0 );.  do
dfc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
dfd0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
dfe0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
dff0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e000: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
e010: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e020: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
e030: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b  an);.    pItem++
e040: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e  ;.  }while( --i>
e050: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  0 );.  sqlite3Db
e060: 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  FreeNN(db, pList
e070: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
e080: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
e090: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
e0a0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
e0b0: 20 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70   if( pList ) exp
e0c0: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62  rListDeleteNN(db
e0d0: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
e0e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
e0f0: 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20  twise-OR of all 
e100: 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
e110: 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a  s in the given.*
e120: 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75  * ExprList..*/.u
e130: 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  32 sqlite3ExprLi
e140: 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78  stFlags(const Ex
e150: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
e160: 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d    int i;.  u32 m
e170: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
e180: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 66 6f  pList!=0 );.  fo
e190: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
e1a0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e1b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
e1c0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e1d0: 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74 28 20  r;.     assert( 
e1e0: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
e1f0: 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61   m |= pExpr->fla
e200: 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  gs;.  }.  return
e210: 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   m;.}../*.** Thi
e220: 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d 6e 6f  s is a SELECT-no
e230: 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  de callback for 
e240: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77  the expression w
e250: 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20 61 6c  alker that.** al
e260: 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20 20 42  ways "fails".  B
e270: 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68 69 73  y "fail" in this
e280: 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e 20 73   case, we mean s
e290: 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65  et.** pWalker->e
e2a0: 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61 6e 64  Code to zero and
e2b0: 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   abort..**.** Th
e2c0: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 75  is callback is u
e2d0: 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  sed by multiple 
e2e0: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
e2f0: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
e300: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
e310: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
e320: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
e330: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
e340: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
e350: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
e360: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
e370: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a  WRC_Abort;.}../*
e380: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
e390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
e3a0: 6e 20 49 44 20 77 69 74 68 20 74 68 65 20 6e 61  n ID with the na
e3b0: 6d 65 20 22 74 72 75 65 22 20 6f 72 20 22 66 61  me "true" or "fa
e3c0: 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e  lse".** then con
e3d0: 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61 6e 20  vert it into an 
e3e0: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 74 65 72  TK_TRUEFALSE ter
e3f0: 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  m.  Return non-z
e400: 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ero if.** the co
e410: 6e 76 65 72 73 69 6f 6e 20 68 61 70 70 65 6e 65  nversion happene
e420: 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 74  d, and zero if t
e430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e440: 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69   unaltered..*/.i
e450: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 64  nt sqlite3ExprId
e460: 54 6f 54 72 75 65 46 61 6c 73 65 28 45 78 70 72  ToTrueFalse(Expr
e470: 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65   *pExpr){.  asse
e480: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
e490: 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_ID || pExpr->o
e4a0: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a  p==TK_STRING );.
e4b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
e4c0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
e4d0: 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30  oken, "true")==0
e4e0: 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  .   || sqlite3St
e4f0: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
e500: 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22 29 3d  Token, "false")=
e510: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70  =0.  ){.    pExp
e520: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55 45 46  r->op = TK_TRUEF
e530: 41 4c 53 45 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALSE;.    return
e540: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
e550: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
e560: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
e570: 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  e a TK_TRUEFALSE
e580: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74   Expr node.  Ret
e590: 75 72 6e 20 31 20 69 66 20 69 74 20 69 73 20 54  urn 1 if it is T
e5a0: 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  RUE.** and 0 if 
e5b0: 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a  it is FALSE..*/.
e5c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 54  int sqlite3ExprT
e5d0: 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20  ruthValue(const 
e5e0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
e5f0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
e600: 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  p==TK_TRUEFALSE 
e610: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e620: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
e630: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75  r->u.zToken,"tru
e640: 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e")==0.       ||
e650: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e660: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
e670: 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20  "false")==0 );. 
e680: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75   return pExpr->u
e690: 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d  .zToken[4]==0;.}
e6a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72  .../*.** These r
e6b0: 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b  outines are Walk
e6c0: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65  er callbacks use
e6d0: 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65  d to check expre
e6e0: 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65  ssions to.** see
e6f0: 20 69 66 20 74 68 65 79 20 61 72 65 20 22 63 6f   if they are "co
e700: 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65  nstant" for some
e710: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63   definition of c
e720: 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a  onstant.  The.**
e730: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
e740: 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74  lue determines t
e750: 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73  he type of "cons
e760: 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f  tant" we are loo
e770: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a  king.** for..**.
e780: 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63  ** These callbac
e790: 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  k routines are u
e7a0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
e7b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
e7c0: 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
e7d0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
e7e0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
e7f0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e800: 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==1.**     sqli
e810: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
e820: 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20  tNotJoin()      
e830: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e840: 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71  ode==2.**     sq
e850: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
e860: 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20  Constant()      
e870: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e880: 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20  eCode==3.**     
e890: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
e8a0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
e8b0: 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  )        pWalker
e8c0: 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a  ->eCode==4 or 5.
e8d0: 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73  **.** In all cas
e8e0: 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  es, the callback
e8f0: 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f  s set Walker.eCo
e900: 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69  de=0 and abort i
e910: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e920: 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  .** is found to 
e930: 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  not be a constan
e940: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  t..**.** The sql
e950: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
e960: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69  ntOrFunction() i
e970: 73 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75  s used for evalu
e980: 61 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ating expression
e990: 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  s.** in a CREATE
e9a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e9b0: 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43  .  The Walker.eC
e9c0: 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35 20 77  ode value is 5 w
e9d0: 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61  hen parsing.** a
e9e0: 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  n existing schem
e9f0: 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f  a and 4 when pro
ea00: 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74  cessing a new st
ea10: 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e  atement.  A boun
ea20: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72  d.** parameter r
ea30: 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66  aises an error f
ea40: 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74  or new statement
ea50: 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74  s, but is silent
ea60: 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ly converted.** 
ea70: 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73  to NULL for exis
ea80: 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54  ting schemas.  T
ea90: 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74  his allows sqlit
eaa0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
eab0: 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  that .** contain
eac0: 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   a bound paramet
ead0: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 79 20  er because they 
eae0: 77 65 72 65 20 67 65 6e 65 72 61 74 65 64 20 62  were generated b
eaf0: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
eb00: 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f  .** of SQLite to
eb10: 20 62 65 20 70 61 72 73 65 64 20 62 79 20 6e 65   be parsed by ne
eb20: 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
eb30: 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72  SQLite without r
eb40: 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66  aising a.** malf
eb50: 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72  ormed schema err
eb60: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
eb70: 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  t exprNodeIsCons
eb80: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
eb90: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
eba0: 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61  r){..  /* If pWa
ebb0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32  lker->eCode is 2
ebc0: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
ebd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ebe0: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
ebf0: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
ec00: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
ec10: 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73   a left join dis
ec20: 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78  qualifies the ex
ec30: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72  pression.  ** fr
ec40: 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  om being conside
ec50: 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f  red constant. */
ec60: 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
ec70: 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72  eCode==2 && Expr
ec80: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ec90: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
eca0: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
ecb0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
ecc0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ecd0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
ece0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
ecf0: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
ed00: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
ed10: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
ed20: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
ed30: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
ed40: 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c   and either pWal
ed50: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
ed60: 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69   5 or the functi
ed70: 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a  on has the.    *
ed80: 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  * SQLITE_FUNC_CO
ed90: 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20  NST flag. */.   
eda0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
edb0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
edc0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c  lker->eCode>=4 |
edd0: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
ede0: 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74  y(pExpr,EP_Const
edf0: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
ee00: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
ee10: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
ee20: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  e{.        pWalk
ee30: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
ee40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
ee50: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
ee60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
ee70: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
ee80: 74 20 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c  t "true" or "fal
ee90: 73 65 22 20 69 6e 20 61 20 44 45 46 41 55 4c 54  se" in a DEFAULT
eea0: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74 68 65   clause into the
eeb0: 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 70  .      ** approp
eec0: 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46 41 4c  riate TK_TRUEFAL
eed0: 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  SE operator */. 
eee0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
eef0: 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73  ExprIdToTrueFals
ef00: 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
ef10: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
ef20: 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
ef30: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
ef40: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
ef50: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
ef60: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
ef70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
ef80: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
ef90: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
efa0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
efb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
efc0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
efd0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
efe0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
eff0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
f000: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f010: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f020: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
f030: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
f040: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
f050: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
f060: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
f070: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f080: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
f090: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
f0a0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
f0b0: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
f0c0: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65  LL_ROW:.    case
f0d0: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20   TK_REGISTER:.  
f0e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f0f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
f100: 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65  STER );.      te
f110: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f120: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
f130: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
f140: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
f150: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
f160: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
f170: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
f180: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
f190: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
f1a0: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
f1b0: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
f1c0: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
f1d0: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
f1e0: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
f1f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
f200: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
f210: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
f220: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
f230: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
f240: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f250: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
f260: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
f270: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
f280: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
f290: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
f2a0: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
f2b0: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
f2c0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
f2d0: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
f2e0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
f2f0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
f300: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
f310: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
f320: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
f330: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
f340: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
f350: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
f360: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
f370: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
f380: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f390: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
f3a0: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
f3b0: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
f3c0: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
f3d0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f3e0: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
f3f0: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
f400: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
f410: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
f420: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f430: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
f440: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
f450: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
f460: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
f470: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
f480: 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74    w.eCode = init
f490: 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43  Flag;.  w.xExprC
f4a0: 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
f4b0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
f4c0: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
f4d0: 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
f4e0: 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
f4f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
f500: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
f510: 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
f520: 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
f530: 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75  #endif.  w.u.iCu
f540: 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69  r = iCur;.  sqli
f550: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
f560: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
f570: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
f580: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
f590: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
f5a0: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
f5b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
f5c0: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
f5d0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
f5e0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
f5f0: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
f600: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
f610: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
f620: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
f630: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
f640: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
f650: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
f660: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
f670: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
f680: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
f690: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
f6a0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
f6b0: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
f6c0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
f6d0: 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30  rIsConst(p, 1, 0
f6e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
f6f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
f700: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
f710: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
f720: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
f730: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
f740: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
f750: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
f760: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
f770: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
f780: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
f790: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
f7a0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
f7b0: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
f7c0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
f7d0: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
f7e0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f7f0: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
f800: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
f810: 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29  IsConst(p, 2, 0)
f820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
f830: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
f840: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
f850: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
f860: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
f870: 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69  nt.** for any si
f880: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
f890: 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
f8a0: 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65  r iCur.  In othe
f8b0: 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20  r words, the.** 
f8c0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
f8d0: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
f8e0: 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
f8f0: 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20  ic function nor 
f900: 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68  any.** table oth
f910: 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f  er than iCur..*/
f920: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f930: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
f940: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75  Expr *p, int iCu
f950: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  r){.  return exp
f960: 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69  rIsConst(p, 3, i
f970: 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Cur);.}.../*.** 
f980: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
f990: 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  ) callback used 
f9a0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  by sqlite3ExprIs
f9b0: 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
f9c0: 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y()..*/.static i
f9d0: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
f9e0: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 57  stantOrGroupBy(W
f9f0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
fa00: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
fa10: 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
fa20: 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  By = pWalker->u.
fa30: 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20  pGroupBy;.  int 
fa40: 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  i;..  /* Check i
fa50: 66 20 70 45 78 70 72 20 69 73 20 69 64 65 6e 74  f pExpr is ident
fa60: 69 63 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55  ical to any GROU
fa70: 50 20 42 59 20 74 65 72 6d 2e 20 49 66 20 73 6f  P BY term. If so
fa80: 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20  , consider.  ** 
fa90: 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f  it constant.  */
faa0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47  .  for(i=0; i<pG
fab0: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
fac0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
fad0: 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
fae0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
faf0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
fb00: 61 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70 2c  are(0, pExpr, p,
fb10: 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20   -1)<2 ){.      
fb20: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
fb30: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f   sqlite3ExprNNCo
fb40: 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70  llSeq(pWalker->p
fb50: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
fb60: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
fb70: 69 63 6d 70 28 22 42 49 4e 41 52 59 22 2c 20 70  icmp("BINARY", p
fb80: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  Coll->zName)==0 
fb90: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
fba0: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
fbb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
fbc0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45    /* Check if pE
fbd0: 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c  xpr is a sub-sel
fbe0: 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73  ect. If so, cons
fbf0: 69 64 65 72 20 69 74 20 76 61 72 69 61 62 6c 65  ider it variable
fc00: 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48  . */.  if( ExprH
fc10: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
fc20: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
fc30: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
fc40: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
fc50: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
fc60: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65  .  }..  return e
fc70: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
fc80: 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72  t(pWalker, pExpr
fc90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
fca0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
fcb0: 74 72 65 65 20 70 61 73 73 65 64 20 61 73 20 74  tree passed as t
fcc0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
fcd0: 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  t. Return non-ze
fce0: 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70  ro.** if the exp
fcf0: 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73  ression consists
fd00: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e   entirely of con
fd10: 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73  stants or copies
fd20: 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e   of terms .** in
fd30: 20 70 47 72 6f 75 70 42 79 20 74 68 61 74 20 73   pGroupBy that s
fd40: 6f 72 74 20 77 69 74 68 20 74 68 65 20 42 49 4e  ort with the BIN
fd50: 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ARY collation se
fd60: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
fd70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
fd80: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
fd90: 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  if a term of the
fda0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63   HAVING clause c
fdb0: 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65  an.** be promote
fdc0: 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45  d into the WHERE
fdd0: 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64   clause.  In ord
fde0: 65 72 20 66 6f 72 20 73 75 63 68 20 61 20 70 72  er for such a pr
fdf0: 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c  omotion to work,
fe00: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
fe10: 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
fe20: 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  se term must be 
fe30: 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c  the same for all
fe40: 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61   members of.** a
fe50: 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72   "group".  The r
fe60: 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20  equirement that 
fe70: 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
fe80: 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59  m must be BINARY
fe90: 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74  .** assumes that
fea0: 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74   no other collat
feb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c  ing sequence wil
fec0: 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67  l have a finer-g
fed0: 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69  rained.** groupi
fee0: 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20  ng than binary. 
fef0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   In other words 
ff00: 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e  (A=B COLLATE bin
ff10: 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  ary) implies.** 
ff20: 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68  A=B in every oth
ff30: 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  er collating seq
ff40: 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75  uence.  The requ
ff50: 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
ff60: 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20  .** GROUP BY be 
ff70: 42 49 4e 41 52 59 20 69 73 20 73 74 72 69 63 74  BINARY is strict
ff80: 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  er than necessar
ff90: 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73  y.  It would als
ffa0: 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f  o work.** to pro
ffb0: 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75  mote HAVING clau
ffc0: 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
ffd0: 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76   same alternativ
ffe0: 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
fff0: 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 47  equence as the G
10000 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75  ROUP BY term, bu
10010 74 20 74 68 61 74 20 69 73 20 6d 75 63 68 20 68  t that is much h
10020 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a  arder to check,.
10030 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  ** alternative c
10040 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10050 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c  es are uncommon,
10060 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c   and this is onl
10070 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  y an.** optimiza
10080 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65  tion, so we take
10090 20 74 68 65 20 65 61 73 79 20 77 61 79 20 6f 75   the easy way ou
100a0 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71  t and simply req
100b0 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55  uire the.** GROU
100c0 50 20 42 59 20 74 6f 20 75 73 65 20 74 68 65 20  P BY to use the 
100d0 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67  BINARY collating
100e0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e   sequence..*/.in
100f0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
10100 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
10110 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10120 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73  Expr *p, ExprLis
10130 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20  t *pGroupBy){.  
10140 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43  Walker w;.  w.eC
10150 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78  ode = 1;.  w.xEx
10160 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
10170 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f  rNodeIsConstantO
10180 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53  rGroupBy;.  w.xS
10190 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
101a0 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42  0;.  w.u.pGroupB
101b0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
101c0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
101d0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
101e0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
101f0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
10200 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
10210 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
10220 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
10230 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
10240 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
10250 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
10260 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
10270 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
10280 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
10290 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
102a0 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
102b0 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
102c0 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
102d0 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
102e0 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
102f0 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
10300 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
10310 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
10320 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
10330 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
10340 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
10350 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10360 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
10370 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20  ion(Expr *p, u8 
10380 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72  isInit){.  asser
10390 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t( isInit==0 || 
103a0 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72  isInit==1 );.  r
103b0 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
103c0 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30  t(p, 4+isInit, 0
103d0 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
103e0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
103f0 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61  R_HINTS./*.** Wa
10400 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
10410 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
10420 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10430 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  on contains a.**
10440 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d   subquery of som
10450 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20  e kind.  Return 
10460 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  0 if there are n
10470 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f  o subqueries..*/
10480 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10490 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79  ContainsSubquery
104a0 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c  (Expr *p){.  Wal
104b0 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
104c0 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43   = 1;.  w.xExprC
104d0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
104e0 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
104f0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
10500 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
10510 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64  ctWalkFail;.#ifd
10520 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10530 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
10540 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65  ack2 = sqlite3Se
10550 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b  lectWalkAssert2;
10560 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10570 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
10580 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
10590 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  de==0;.}.#endif.
105a0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
105b0 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
105c0 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
105d0 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
105e0 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
105f0 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
10600 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
10610 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
10620 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
10630 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
10640 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
10650 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
10660 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
10670 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
10680 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
10690 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
106a0 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
106b0 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
106c0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
106d0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
106e0 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
106f0 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
10700 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  c = 0;.  if( p==
10710 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
10720 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  * Can only happe
10730 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f  n following on O
10740 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  OM */..  /* If a
10750 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
10760 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72  an integer liter
10770 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20  al that fits in 
10780 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a  a signed 32-bit.
10790 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68    ** integer, th
107a0 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  en the EP_IntVal
107b0 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76  ue flag will hav
107c0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
107d0 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  et */.  assert( 
107e0 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  p->op!=TK_INTEGE
107f0 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26  R || (p->flags &
10800 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
10810 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
10820 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
10830 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29  ->u.zToken, &rc)
10840 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
10850 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
10860 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
10870 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
10880 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
10890 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
108a0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
108b0 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
108c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45     rc = sqlite3E
108d0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
108e0 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
108f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10900 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
10910 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
10920 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
10930 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
10940 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
10950 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  v) ){.        as
10960 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34  sert( v!=(-21474
10970 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20  83647-1) );.    
10980 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
10990 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
109a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
109b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
109c0 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
109d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
109e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
109f0 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65  n FALSE if there
10a00 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
10a10 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
10a20 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a  n can be NULL..*
10a30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
10a40 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20  ession might be 
10a50 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65  NULL or if the e
10a60 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f  xpression is too
10a70 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74   complex.** to t
10a80 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e  ell return TRUE.
10a90 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
10aa0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73  utine is used as
10ab0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
10ac0 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e  , to skip OP_IsN
10ad0 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77  ull opcodes.** w
10ae0 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hen we know that
10af0 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
10b00 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  be NULL.  Hence,
10b10 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
10b20 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  e.** (returning 
10b30 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63  TRUE when in fac
10b40 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
10b50 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55   can never be NU
10b60 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  LL) might.** be 
10b70 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61  a small performa
10b80 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f  nce hit but is o
10b90 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73  therwise harmles
10ba0 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  s.  On the other
10bb0 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73  .** hand, a fals
10bc0 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75  e negative (retu
10bd0 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e  rning FALSE when
10be0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c   the result coul
10bf0 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69  d be NULL).** wi
10c00 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
10c10 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
10c20 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65   answer.  So whe
10c30 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
10c40 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69  rn.** TRUE..*/.i
10c50 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  nt sqlite3ExprCa
10c60 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78  nBeNull(const Ex
10c70 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b  pr *p){.  u8 op;
10c80 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
10c90 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
10ca0 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
10cb0 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
10cc0 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
10cd0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
10ce0 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
10cf0 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
10d00 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
10d10 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
10d20 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
10d30 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
10d40 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
10d50 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
10d60 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
10d70 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74 75  LUMN:.      retu
10d80 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
10d90 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
10da0 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
10db0 20 20 20 20 70 2d 3e 70 54 61 62 3d 3d 30 20 7c      p->pTab==0 |
10dc0 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20  |  /* Reference 
10dd0 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  to column of ind
10de0 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  ex on expression
10df0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
10e00 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   (p->iColumn>=0 
10e10 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  && p->pTab->aCol
10e20 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  [p->iColumn].not
10e30 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65  Null==0);.    de
10e40 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
10e50 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
10e60 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10e70 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
10e80 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
10e90 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
10ea0 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
10eb0 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
10ec0 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
10ed0 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
10ee0 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
10ef0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
10f00 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
10f10 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
10f20 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
10f30 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
10f40 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
10f50 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
10f60 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
10f70 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
10f80 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
10f90 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
10fa0 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
10fb0 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
10fc0 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
10fd0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
10fe0 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
10ff0 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
11000 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
11010 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
11020 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
11030 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
11040 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
11050 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
11060 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
11070 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
11080 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
11090 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
110a0 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
110b0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
110c0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
110d0 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
110e0 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
110f0 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
11100 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
11110 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
11120 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
11130 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11140 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
11150 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
11160 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
11170 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11180 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
11190 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
111a0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
111b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
111c0 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
111d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
111e0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
111f0 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
11200 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
11210 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
11220 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
11230 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
11240 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
11250 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
11260 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
11270 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11280 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
11290 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
112a0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
112b0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
112c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
112d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
112e0 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
112f0 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
11300 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
11310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
11320 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
11330 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
11340 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
11350 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
11360 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
11370 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
11380 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
11390 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
113a0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
113b0 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
113c0 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
113d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20  .}../*.** pX is 
113e0 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
113f0 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70   operator.  If p
11400 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74  X is a SELECT st
11410 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  atement .** that
11420 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69   can be simplifi
11430 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20 74  ed to a direct t
11440 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65  able access, the
11450 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  n return.** a po
11460 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c  inter to the SEL
11470 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
11480 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53  If pX is not a S
11490 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
114a0 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45  .** or if the SE
114b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e  LECT statement n
114c0 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66  eeds to be manif
114d0 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ested into a tra
114e0 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c  nsient.** table,
114f0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c   then return NUL
11500 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  L..*/.#ifndef SQ
11510 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
11520 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  RY.static Select
11530 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72   *isCandidateFor
11540 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b  InOpt(Expr *pX){
11550 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
11560 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
11570 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11580 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
11590 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
115a0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
115b0 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
115c0 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ct) ) return 0; 
115d0 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65   /* Not a subque
115e0 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  ry */.  if( Expr
115f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
11600 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29  EP_VarSelect)  )
11610 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
11620 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a  orrelated subq *
11630 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53  /.  p = pX->x.pS
11640 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e  elect;.  if( p->
11650 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
11660 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11670 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
11680 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
11690 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
116a0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
116b0 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
116c0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
116d0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
116e0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
116f0 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
11700 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
11710 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
11720 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
11730 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
11740 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
11750 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
11760 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
11770 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
11780 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
11790 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
117a0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
117b0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
117c0 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
117d0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
117e0 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
117f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11800 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
11810 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
11820 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
11830 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
11850 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
11860 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
11870 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
11880 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
11890 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
118a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
118b0 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
118c0 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
118d0 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
118e0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
118f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
11900 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
11910 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
11920 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
11930 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61  ->a[0].pTab;.  a
11940 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
11950 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
11960 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
11970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
11980 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
11990 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
119a0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
119b0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
119c0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
119d0 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
119e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
119f0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
11a00 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
11a10 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  !=0 );.  /* All 
11a20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d  SELECT results m
11a30 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20  ust be columns. 
11a40 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
11a50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
11a60 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
11a70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
11a80 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
11a90 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
11aa0 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
11ab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
11ac0 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  es->iTable==pSrc
11ad0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[0].iCursor )
11ae0 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ;  /* Not a corr
11af0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
11b00 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
11b10 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  p;.}.#endif /* S
11b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11b30 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
11b40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
11b50 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
11b60 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
11b70 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
11b80 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
11b90 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
11ba0 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
11bb0 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
11bc0 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
11bd0 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
11be0 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
11bf0 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
11c00 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
11c10 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
11c20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
11c30 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
11c40 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
11c50 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
11c60 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
11c70 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
11c80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11c90 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
11ca0 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
11cb0 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
11cc0 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
11cd0 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33  addr1;.  sqlite3
11ce0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11cf0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
11d00 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  HasNull);.  addr
11d10 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
11d20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
11d30 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43  nd, iCur); VdbeC
11d40 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
11d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11d60 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
11d70 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  ur, 0, regHasNul
11d80 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
11d90 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
11da0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
11db0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
11dc0 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69  , "first_entry_i
11dd0 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a  n(%d)", iCur));.
11de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11df0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
11e00 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
11e10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11e20 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
11e30 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
11e40 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
11e50 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
11e60 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
11e70 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
11e80 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
11e90 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
11ea0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
11eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
11ec0 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
11ed0 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
11ee0 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
11ef0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
11f00 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
11f10 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
11f20 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
11f30 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
11f40 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
11f50 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
11f60 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
11f70 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
11f80 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
11f90 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
11fa0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11fb0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
11fc0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
11fd0 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
11fe0 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
11ff0 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
12000 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
12010 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
12020 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12030 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
12040 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
12050 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
12060 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
12070 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
12080 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12090 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
120a0 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
120b0 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
120c0 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
120d0 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
120e0 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
120f0 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
12100 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
12110 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
12120 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
12130 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
12140 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
12150 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
12160 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
12170 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
12180 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
12190 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
121a0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
121b0 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
121c0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
121d0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
121e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
121f0 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
12200 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
12210 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
12220 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
12230 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
12240 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
12250 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
12260 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
12270 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
12280 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12290 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
122a0 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
122b0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
122c0 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
122d0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
122e0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
122f0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
12300 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
12310 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12320 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
12330 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
12360 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
12370 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
12380 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
12390 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
123a0 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
123b0 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
123e0 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
123f0 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
12400 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
12410 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
12420 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
12430 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
12440 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
12450 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
12460 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
12470 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
12480 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
12490 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
124a0 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
124b0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
124c0 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
124d0 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
124e0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
124f0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
12500 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
12510 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
12520 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
12530 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
12540 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
12550 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
12560 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
12570 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
12580 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
12590 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
125a0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74  must contain, at
125b0 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20   a minimum, one 
125c0 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49  of the bits.** I
125d0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
125e0 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c  IP or IN_INDEX_L
125f0 4f 4f 50 20 62 75 74 20 6e 6f 74 20 62 6f 74 68  OOP but not both
12600 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
12610 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
12620 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
12630 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
12640 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
12650 75 73 65 64 20 66 6f 72 20 61 20 66 61 73 74 0a  used for a fast.
12660 2a 2a 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  ** membership te
12670 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
12680 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
12690 69 73 20 73 65 74 2c 20 74 68 65 20 49 4e 20 69  is set, the IN i
126a0 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ndex will.** be 
126b0 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
126c0 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
126d0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
126e0 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
126f0 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
12700 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e  LOOP is used (an
12710 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
12720 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
12730 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
12740 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29  the set members)
12750 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
12760 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69   must not contai
12770 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  n duplicates..**
12780 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   An epheremal ta
12790 62 6c 65 20 77 69 6c 6c 20 62 65 20 63 72 65 61  ble will be crea
127a0 74 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  ted unless the s
127b0 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20  elected columns 
127c0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a  are guaranteed.*
127d0 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
127e0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
127f0 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
12800 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
12810 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51  due to.** a UNIQ
12820 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
12830 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68   index..**.** Wh
12840 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  en IN_INDEX_MEMB
12850 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28  ERSHIP is used (
12860 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
12870 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
12880 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d  for fast set mem
12890 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74  bership tests) t
128a0 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  hen an epheremal
128b0 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
128c0 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
128d0 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69  columns> is a si
128e0 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49  ngle INTEGER PRI
128f0 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
12900 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20  or an .** index 
12910 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74  can be found wit
12920 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
12930 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73  <columns> as its
12940 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a   left-most..**.*
12950 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
12960 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
12970 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
12980 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
12990 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
129a0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
129b0 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
129c0 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
129d0 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
129e0 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
129f0 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
12a00 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
12a10 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
12a20 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
12a30 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
12a40 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
12a50 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
12a60 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
12a70 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
12a80 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
12a90 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
12aa0 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
12ab0 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
12ac0 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
12ad0 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
12ae0 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
12af0 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
12b00 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
12b10 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
12b20 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
12b30 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
12b40 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
12b50 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
12b60 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
12b70 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
12b80 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
12b90 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
12ba0 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
12bb0 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
12bc0 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
12bd0 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
12be0 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
12bf0 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
12c00 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
12c10 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
12c20 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
12c30 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
12c40 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
12c50 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
12c60 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
12c70 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
12c80 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
12c90 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
12ca0 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
12cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
12cc0 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
12cd0 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
12ce0 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
12cf0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
12d00 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
12d10 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
12d20 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
12d30 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
12d40 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
12d50 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
12d60 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
12d70 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
12d80 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
12d90 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
12da0 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
12db0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61  *.** If the aiMa
12dc0 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  p parameter is n
12dd0 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74  ot NULL, it must
12de0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
12df0 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  ay containing.**
12e00 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72   one element for
12e10 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74   each column ret
12e20 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
12e30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
12e40 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74   the RHS.** of t
12e50 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  he IN(...) opera
12e60 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e  tor. The i'th en
12e70 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79  try of the array
12e80 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
12e90 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74  th the.** offset
12ea0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
12eb0 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65  lumn that matche
12ec0 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d  s the i'th colum
12ed0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
12ee0 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72  e.** SELECT. For
12ef0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
12f00 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
12f10 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61  selected index a
12f20 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f  re:.**.**   (?,?
12f30 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61  ,?) IN (SELECT a
12f40 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a  , b, c FROM t1).
12f50 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
12f60 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c  X i1 ON t1(b, c,
12f70 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   a);.**.** then 
12f80 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c  aiMap[] is popul
12f90 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c  ated with {2, 0,
12fa0 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   1}..*/.#ifndef 
12fb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12fc0 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
12fd0 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50  FindInIndex(.  P
12fe0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
13000 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13010 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20    Expr *pX,     
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13030 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
13040 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65  ide (RHS) of the
13050 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
13060 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20    u32 inFlags,  
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13080 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f  IN_INDEX_LOOP, _
13090 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f  MEMBERSHIP, and/
130a0 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20  or _NOOP_OK */. 
130b0 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75   int *prRhsHasNu
130c0 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ll,         /* R
130d0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
130e0 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65  NULL status.  Se
130f0 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74  e notes */.  int
13100 20 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20 20   *aiMap         
13110 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
13120 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69  ng from Index fi
13130 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c  elds to RHS fiel
13140 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ds */.){.  Selec
13150 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
13180 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
13190 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
131a0 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131c0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
131d0 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
131e0 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
131f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13200 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
13210 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
13220 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
13230 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20  t mustBeUnique; 
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13250 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52      /* True if R
13260 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
13270 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
13280 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13290 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
132a0 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
132b0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
132c0 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
132d0 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73  ==TK_IN );.  mus
132e0 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46  tBeUnique = (inF
132f0 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
13300 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  LOOP)!=0;..  /* 
13310 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
13320 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  is IN(...) opera
13330 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c  tor is a SELECT,
13340 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65   and if it matte
13350 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  rs .  ** whether
13360 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45   or not the SELE
13370 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  CT result contai
13380 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ns NULL values, 
13390 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20  check whether.  
133a0 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69  ** or not NULL i
133b0 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
133c0 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20  ble (it may not 
133d0 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  be, for example,
133e0 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f   due .  ** to NO
133f0 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
13400 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
13410 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61  ). If no NULL va
13420 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  lues are possibl
13430 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68  e,.  ** set prRh
13440 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65  sHasNull to 0 be
13450 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
13460 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73    */.  if( prRhs
13470 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e  HasNull && (pX->
13480 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
13490 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  lect) ){.    int
134a0 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   i;.    ExprList
134b0 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78   *pEList = pX->x
134c0 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
134d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
134e0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
134f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
13500 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
13510 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69  Null(pEList->a[i
13520 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b  ].pExpr) ) break
13530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13540 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  i==pEList->nExpr
13550 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48   ){.      prRhsH
13560 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  asNull = 0;.    
13570 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
13580 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
13590 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
135a0 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
135b0 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
135c0 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
135d0 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
135e0 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
135f0 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
13600 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f  meral table.  */
13610 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
13620 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69  Err==0 && (p = i
13630 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
13640 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20  pt(pX))!=0 ){.  
13650 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13660 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
13670 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
13680 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13690 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
136a0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
136c0 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
136d0 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13700 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
13710 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78  r pTab */.    Ex
13720 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
13730 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
13740 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69  int nExpr = pELi
13750 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
13760 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13770 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
13780 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
13790 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
137a0 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
137b0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
137c0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  t->a[0].pExpr!=0
137d0 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f   ); /* Because o
137e0 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
137f0 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
13800 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
13810 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
13820 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
13830 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
13840 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
13850 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
13860 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20  a[0].pTab;..    
13870 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
13880 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
13890 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
138a0 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
138b0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
138c0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
138d0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
138e0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
138f0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
13900 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
13910 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
13920 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
13930 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
13940 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65  Name);..    asse
13950 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74  rt(v);  /* sqlit
13960 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73 20  e3GetVdbe() has 
13970 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65 76  always been prev
13980 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f  iously called */
13990 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d  .    if( nExpr==
139a0 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
139b0 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
139c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  <0 ){.      /* T
139d0 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  he "x IN (SELECT
139e0 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c   rowid FROM tabl
139f0 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  e)" case */.    
13a00 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
13a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13a20 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20  v, OP_Once);.   
13a30 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
13a40 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  v);..      sqlit
13a50 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
13a60 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
13a70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
13a80 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
13a90 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
13aa0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
13ab0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
13ac0 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
13ad0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
13ae0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b00 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
13b10 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
13b20 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a  ffinity_ok = 1;.
13b30 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20        int i;..  
13b40 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
13b50 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
13b60 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
13b70 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68   to perform each
13b80 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
13b90 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
13ba0 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
13bb0 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  y of each column
13bc0 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20   in table.      
13bd0 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ** on the RHS of
13be0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
13bf0 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74  .  If it not, it
13c00 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
13c10 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65   to.      ** use
13c20 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68   any index of th
13c30 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f  e RHS table.  */
13c40 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
13c50 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e  i<nExpr && affin
13c60 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20  ity_ok; i++){.  
13c70 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
13c80 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
13c90 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
13ca0 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
13cb0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
13cc0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
13cd0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
13ce0 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
13cf0 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f  = sqlite3TableCo
13d00 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61  lumnAffinity(pTa
13d10 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20  b,iCol); /* RHS 
13d20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
13d30 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73   char cmpaff = s
13d40 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
13d50 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61  inity(pLhs, idxa
13d60 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ff);.        tes
13d70 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
13d80 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
13d90 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
13da0 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49  se( cmpaff==SQLI
13db0 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
13dc0 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63         switch( c
13dd0 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  mpaff ){.       
13de0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
13df0 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20  FF_BLOB:.       
13e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13e10 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
13e20 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
13e30 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
13e40 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
13e50 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73  y() only returns
13e60 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64   TEXT if one sid
13e70 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20  e or the.       
13e80 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61       ** other ha
13e90 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e  s no affinity an
13ea0 64 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  d the other side
13eb0 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65   is TEXT.  Hence
13ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ,.            **
13ed0 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f   the only way fo
13ee0 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54  r cmpaff to be T
13ef0 45 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66  EXT is for idxaf
13f00 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20  f to be TEXT.   
13f10 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
13f20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20  for the term on 
13f30 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
13f40 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66  N to have no aff
13f50 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  inity. */.      
13f60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
13f70 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  xaff==SQLITE_AFF
13f80 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
13f90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13fa0 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
13fb0 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e             affin
13fc0 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
13fd0 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
13fe0 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  y(idxaff);.     
13ff0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
14000 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79      if( affinity
14010 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _ok ){.        /
14020 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
14030 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74  existing index t
14040 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f  hat will work fo
14050 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
14060 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  or */.        fo
14070 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
14080 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
14090 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78  pe==0; pIdx=pIdx
140a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
140b0 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55      Bitmask colU
140c0 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c  sed;      /* Col
140d0 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
140e0 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  x used */.      
140f0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c      Bitmask mCol
14100 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
14110 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  k for the curren
14120 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20  t column */.    
14130 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
14140 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20  nColumn<nExpr ) 
14150 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14160 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
14170 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
14180 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
14190 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
141a0 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
141b0 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
141c0 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
141d0 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
141e0 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
141f0 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
14200 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14210 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
14220 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
14230 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14240 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
14250 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14260 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
14270 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
14280 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14290 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
142a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
142b0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
142c0 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
142d0 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
142e0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
142f0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
14300 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
14310 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
14320 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
14330 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
14340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14350 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
14360 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
14370 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
14380 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
14390 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
143a0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
143b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
143c0 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
143d0 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
143e0 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
143f0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
14400 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
14410 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
14420 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
14430 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
14440 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
14450 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
14460 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
14470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
14480 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
14490 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
144a0 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
144b0 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
144c0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
144d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
144e0 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
144f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
14500 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
14510 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
14520 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
14530 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
14540 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
14550 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
14560 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14570 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
14580 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
14590 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
145a0 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
145c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
145d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
145e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
145f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14600 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
14610 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
14620 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
14630 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
14640 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
14650 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
14660 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
14670 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
14680 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
14690 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
146a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
146b0 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
146c0 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
146d0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
146e0 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
146f0 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
14700 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
14710 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
14720 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
14730 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
14740 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
14750 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
14760 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
14770 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
14780 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
14790 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
147a0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
147b0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
147c0 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
147d0 67 65 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53  ge(v);.#ifndef S
147e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
147f0 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  IN.            s
14800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14810 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
14820 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  0, 0, 0,.       
14830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
14840 72 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47  rintf(db, "USING
14850 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e   INDEX %s FOR IN
14860 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d  -OPERATOR",pIdx-
14870 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  >zName),.       
14880 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49         P4_DYNAMI
14890 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  C);.#endif.     
148a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
148b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
148c0 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
148d0 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
148e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
148f0 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
14900 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
14910 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
14920 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
14930 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
14940 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
14950 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45   assert( IN_INDE
14960 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20  X_INDEX_DESC == 
14970 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
14980 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  SC+1 );.        
14990 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
149a0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
149b0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
149c0 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20  r[0];.  .       
149d0 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
149e0 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20  sNull ){.#ifdef 
149f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
14a00 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34               i64
14a20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
14a30 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
14a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14a50 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
14a60 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20  ColumnsUsed, .  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a  iTab, 0, 0, (u8*
14a90 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34  )&mask, P4_INT64
14aa0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
14ab0 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
14ac0 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
14ad0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
14ae0 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d        if( nExpr=
14af0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
14b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
14b10 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
14b20 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
14b30 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
14b40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14b50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
14b60 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14b70 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
14b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14b90 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
14ba0 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a  over indexes */.
14bb0 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69        } /* End i
14bc0 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
14bd0 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64   */.    } /* End
14be0 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64   if not an rowid
14bf0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a   index */.  } /*
14c00 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20   End attempt to 
14c10 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61  optimize using a
14c20 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a  n index */..  /*
14c30 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
14c40 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
14c50 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
14c60 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
14c70 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
14c80 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
14c90 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
14ca0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
14cb0 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
14cc0 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
14cd0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
14ce0 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  S is not constan
14cf0 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20  t or has two or 
14d00 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a  fewer terms,.  *
14d10 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
14d20 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20   worth creating 
14d30 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
14d40 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  le to evaluate. 
14d50 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61   ** the IN opera
14d60 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e  tor so return IN
14d70 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a  _INDEX_NOOP..  *
14d80 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  /.  if( eType==0
14d90 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20  .   && (inFlags 
14da0 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  & IN_INDEX_NOOP_
14db0 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48  OK).   && !ExprH
14dc0 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
14dd0 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
14de0 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68  && (!sqlite3InRh
14df0 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20  sIsConstant(pX) 
14e00 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pX->x.pList->
14e10 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20  nExpr<=2).  ){. 
14e20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
14e30 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  DEX_NOOP;.  }.. 
14e40 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
14e50 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
14e60 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
14e70 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
14e80 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
14e90 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
14ea0 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
14eb0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
14ec0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
14ed0 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
14ee0 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
14ef0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
14f00 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
14f10 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
14f20 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
14f30 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
14f40 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
14f50 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
14f60 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
14f70 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
14f80 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
14f90 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
14fa0 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
14fb0 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
14fc0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
14fd0 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
14fe0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
14ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15000 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
15010 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
15020 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
15030 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
15040 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
15050 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
15060 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
15070 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
15080 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
15090 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20  DEX_ROWID);.    
150a0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
150b0 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79  op = savedNQuery
150c0 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Loop;.  }else{. 
150d0 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
150e0 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  iTab;.  }..  if(
150f0 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21   aiMap && eType!
15100 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
15110 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e  ASC && eType!=IN
15120 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
15130 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  C ){.    int i, 
15140 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  n;.    n = sqlit
15150 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
15160 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
15170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
15180 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69  ++) aiMap[i] = i
15190 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
151a0 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
151b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
151c0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
151d0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70  ** Argument pExp
151e0 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e  r is an (?, ?...
151f0 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  ) IN(...) expres
15200 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66  sion. This .** f
15210 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
15220 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
15230 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
15240 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
15250 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74   .** the affinit
15260 69 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66  ies to be used f
15270 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
15280 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
15290 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68  ..**.** It is th
152a0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
152b0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
152c0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
152d0 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74  e returned.** st
152e0 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c  ring is eventual
152f0 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73  ly freed using s
15300 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
15310 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
15320 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50  exprINAffinity(P
15330 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
15340 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
15350 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
15360 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20  r->pLeft;.  int 
15370 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  nVal = sqlite3Ex
15380 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
15390 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ft);.  Select *p
153a0 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d  Select = (pExpr-
153b0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
153c0 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e  elect) ? pExpr->
153d0 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20  x.pSelect : 0;. 
153e0 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
153f0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
15400 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52  p==TK_IN );.  zR
15410 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
15420 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e  llocRaw(pParse->
15430 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69  db, nVal+1);.  i
15440 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69  f( zRet ){.    i
15450 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
15460 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
15470 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20  .      Expr *pA 
15480 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
15490 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
154a0 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61  t, i);.      cha
154b0 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  r a = sqlite3Exp
154c0 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20  rAffinity(pA);. 
154d0 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74       if( pSelect
154e0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
154f0 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  [i] = sqlite3Com
15500 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65  pareAffinity(pSe
15510 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
15520 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20  i].pExpr, a);.  
15530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15540 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a     zRet[i] = a;.
15550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15560 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27    zRet[nVal] = '
15570 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  \0';.  }.  retur
15580 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
15590 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
155a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
155b0 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61  *.** Load the Pa
155c0 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  rse object passe
155d0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
155e0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  rgument with an 
155f0 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
15600 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
15610 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
15620 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
15630 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
15640 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  M".*/   .void sq
15650 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
15660 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
15670 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20  e, int nActual, 
15680 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20  int nExpect){.  
15690 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
156a0 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72   = "sub-select r
156b0 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e  eturns %d column
156c0 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22  s - expected %d"
156d0 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
156e0 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74  Msg(pParse, zFmt
156f0 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65  , nActual, nExpe
15700 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ct);.}.#endif../
15710 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
15720 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f  pExpr is a vecto
15730 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  r that has been 
15740 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78  used in a contex
15750 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73  t where.** it is
15760 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
15770 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75  If pExpr is a su
15780 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c  b-select vector,
15790 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a   this routine .*
157a0 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73  * loads the Pars
157b0 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20  e object with a 
157c0 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
157d0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
157e0 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
157f0 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
15800 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f  ected 1".**.** O
15810 72 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  r, if it is a re
15820 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63  gular scalar vec
15830 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f  tor:.**.**   "ro
15840 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
15850 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
15860 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
15870 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
15880 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23   Expr *pExpr){.#
15890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
158a0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
158b0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
158c0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b   EP_xIsSelect ){
158d0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73  .    sqlite3Subs
158e0 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
158f0 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  e, pExpr->x.pSel
15900 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
15910 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a  pr, 1);.  }else.
15920 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
15930 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15940 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
15950 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d  e misused");.  }
15960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15970 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
15980 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
15990 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
159a0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49   expression, EXI
159b0 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70  STS,.** or IN op
159c0 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
159d0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
159e0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
159f0 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
15a00 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
15a10 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
15a20 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
15a30 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
15a40 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
15a50 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
15a60 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
15a70 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
15a80 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
15a90 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
15aa0 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
15ab0 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
15ac0 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
15ad0 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
15ae0 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
15af0 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
15b00 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
15b10 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
15b20 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
15b30 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
15b40 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
15b50 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
15b60 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
15b70 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
15b80 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
15b90 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
15ba0 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
15bb0 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
15bc0 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
15bd0 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
15be0 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
15bf0 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
15c00 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
15c10 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
15c20 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
15c30 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
15c40 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
15c50 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
15c60 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
15c70 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
15c80 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
15c90 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
15ca0 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
15cb0 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
15cc0 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
15cd0 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
15ce0 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
15cf0 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
15d00 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
15d10 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  ** All this rout
15d20 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
15d30 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73  ialize the regis
15d40 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
15d50 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  yHaveNull.** to 
15d60 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
15d70 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
15d80 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  e care of changi
15d90 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
15da0 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  .** value to non
15db0 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
15dc0 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
15dd0 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43  *.** For a SELEC
15de0 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  T or EXISTS oper
15df0 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ator, return the
15e00 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
15e10 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  olds the.** resu
15e20 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69  lt.  For a multi
15e30 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20  -column SELECT, 
15e40 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
15e50 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67  ored in a contig
15e60 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66  uous.** array of
15e70 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
15e80 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
15e90 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  is the register 
15ea0 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
15eb0 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
15ec0 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72  n.  Return 0 for
15ed0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
15ee0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
15ef0 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  urs..*/.#ifndef 
15f00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
15f10 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
15f20 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
15f30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15f40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
15f50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15f60 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
15f70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15f80 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
15f90 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
15fa0 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c  /.  int rHasNull
15fb0 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52  Flag,       /* R
15fc0 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
15fd0 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
15fe0 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
15ff0 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16010 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
16020 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
16030 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
16040 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20  nt jmpIfDynamic 
16050 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
16060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
16070 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
16080 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
16090 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
160c0 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
160d0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
160e0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
160f0 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
16100 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
16110 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
16120 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
16130 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76  e);..  /* The ev
16140 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
16150 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54  IN/EXISTS/SELECT
16160 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65   must be repeate
16170 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a  d every time it.
16180 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
16190 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  red if any of th
161a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
161b0 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
161c0 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
161d0 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
161e0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
161f0 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
16200 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
16210 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
16220 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
16230 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
16240 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
16250 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
16260 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
16270 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
16280 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
16290 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
162a0 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
162b0 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
162c0 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
162d0 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
162e0 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
162f0 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
16300 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
16310 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
16320 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
16330 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73  jmpIfDynamic = s
16340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
16350 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
16360 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16370 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
16380 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
16390 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
163a0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
163b0 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
163c0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
163d0 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45  se->db, "EXECUTE
163e0 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25   %s%s SUBQUERY %
163f0 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49  d",.        jmpI
16400 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22  fDynamic>=0?"":"
16410 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20  CORRELATED ",.  
16420 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
16430 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53  =TK_IN?"LIST":"S
16440 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20  CALAR",.        
16450 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
16460 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20  ectId.    );.   
16470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16480 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
16490 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
164a0 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
164b0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
164c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74  }.#endif..  swit
164d0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
164e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
164f0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
16500 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
16510 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16520 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
16530 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
16540 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
16550 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
16560 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20  eft; /* the LHS 
16570 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
16580 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49  or */.      KeyI
16590 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
165a0 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69  0;      /* Key i
165b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
165c0 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20      int nVal;   
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f  /* Size of vecto
165f0 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20  r pLeft */.     
16600 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73   .      nVal = s
16610 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
16620 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  Size(pLeft);.   
16630 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
16640 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29  wid || nVal==1 )
16650 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
16660 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
16670 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
16680 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
16690 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
166a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
166b0 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
166c0 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70  same way.  An ep
166d0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73  hemeral table is
166e0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
166f0 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65 79  d with index key
16700 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
16710 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
16720 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45  the .      ** SE
16730 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
16740 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
16750 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
16760 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
16770 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
16780 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
16790 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
167a0 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
167b0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
167c0 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
167d0 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
167e0 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
167f0 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
16800 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
16810 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
16820 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
16830 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
16840 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
16850 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
16860 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
16870 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
16880 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
16890 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
168a0 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
168b0 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
168c0 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
168d0 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
168e0 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
168f0 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
16900 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
16910 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
16920 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
16930 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
16940 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
16950 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
16960 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20  enEphemeral, .  
16970 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
16980 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f  Table, (isRowid?
16990 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20 20  0:nVal));.      
169a0 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77  pKeyInfo = isRow
169b0 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  id ? 0 : sqlite3
169c0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
169d0 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31  rse->db, nVal, 1
169e0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  );..      if( Ex
169f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16a00 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
16a10 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
16a20 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
16a30 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
16a40 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
16a50 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
16a60 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
16a70 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
16a80 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
16a90 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
16aa0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
16ab0 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
16ac0 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
16ad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
16ae0 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45  ct *pSelect = pE
16af0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
16b00 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
16b10 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65   *pEList = pSele
16b20 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20  ct->pEList;..   
16b30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
16b40 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
16b50 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61   /* If the LHS a
16b60 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  nd RHS of the IN
16b70 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
16b80 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20   match, that.   
16b90 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69       ** error wi
16ba0 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75  ll have been cau
16bb0 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20  ght long before 
16bc0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
16bd0 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  int. */.        
16be0 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73  if( ALWAYS(pELis
16bf0 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20  t->nExpr==nVal) 
16c00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
16c10 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
16c20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
16c30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16c40 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
16c50 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
16c60 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
16c70 20 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41           dest.zA
16c80 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41  ffSdst = exprINA
16c90 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
16ca0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
16cb0 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
16cc0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
16cd0 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65   testcase( pSele
16ce0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
16cf0 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
16d00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16d10 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b  ( pKeyInfo==0 );
16d20 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f   /* Caused by OO
16d30 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  M in sqlite3KeyI
16d40 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  nfoAlloc() */.  
16d50 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
16d60 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16d70 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
16d80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
16d90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
16da0 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e  Parse->db, dest.
16db0 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  zAffSdst);.     
16dc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
16dd0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
16de0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
16df0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
16e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16e10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16e20 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74  pParse->db, dest
16e30 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20  .zAffSdst);.    
16e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
16e50 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20  eyInfo!=0 ); /* 
16e60 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65  OOM will cause e
16e70 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65  xit after sqlite
16e80 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20  3Select() */.   
16e90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16ea0 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
16eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
16ec0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
16ed0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
16ee0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
16ef0 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
16f00 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
16f10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
16f20 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
16f30 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
16f40 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
16f50 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
16f60 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
16f70 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
16f80 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[i] = sqlite3Bi
16f90 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
16fa0 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq(.            
16fb0 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70      pParse, p, p
16fc0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
16fd0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  r.            );
16fe0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
17000 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
17010 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
17020 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
17030 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
17040 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
17050 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
17060 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
17070 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
17080 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
17090 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
170a0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
170b0 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
170c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
170d0 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
170e0 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
170f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
17100 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
17110 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
17120 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
17130 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
17140 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
17150 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
17160 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
17170 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  /.        char a
17180 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
17190 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
171a0 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
171b0 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  e IN */.        
171c0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
171d0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
171e0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
171f0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
17200 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
17210 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Item;.        in
17220 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20  t r1, r2, r3;.. 
17230 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
17240 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
17250 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20  inity(pLeft);.  
17260 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
17270 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
17280 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
17290 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
172a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
172b0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
172c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
172d0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
172e0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
172f0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
17300 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
17310 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
17320 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
17330 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
17340 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
17350 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
17360 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
17370 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
17380 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31  >. */.        r1
17390 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
173a0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
173b0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
173c0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
173d0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
173e0 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69  ( isRowid ) sqli
173f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
17400 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 32 2c   OP_Blob, 0, r2,
17410 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54 49   0, "", P4_STATI
17420 43 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  C);.        for(
17430 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  i=pList->nExpr, 
17440 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
17450 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
17460 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
17470 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
17480 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
17490 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b    int iValToIns;
174a0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
174b0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
174c0 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
174d0 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
174e0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
174f0 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
17500 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
17510 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
17520 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
17530 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
17540 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
17550 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
17560 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
17570 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
17580 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
17590 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
175a0 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
175b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
175c0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70           if( jmp
175d0 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20  IfDynamic>=0 && 
175e0 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
175f0 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
17600 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17610 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
17620 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  op(v, jmpIfDynam
17630 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ic);.           
17640 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
17650 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
17660 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
17670 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
17680 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
17690 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
176a0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
176b0 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
176c0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
176d0 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69  sInteger(pE2, &i
176e0 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20  ValToIns) ){.   
176f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17700 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17710 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70  _InsertInt, pExp
17720 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69  r->iTable, r2, i
17730 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20  ValToIns);.     
17740 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17750 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c          r3 = sql
17760 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
17770 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  et(pParse, pE2, 
17780 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
17790 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
177b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
177c0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
177d0 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
177e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17800 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
17810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
17820 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17830 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17840 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17850 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
17860 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
17870 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  2, r3);.        
17880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17890 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
178a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
178b0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c  _MakeRecord, r3,
178c0 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
178d0 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
178e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
178f0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
17900 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20  nge(pParse, r3, 
17910 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
17920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17930 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
17940 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
17950 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31  Table, r2, r3, 1
17960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
17970 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
17990 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
179a0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
179b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
179c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
179d0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
179e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
179f0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
17a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
17a10 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
17a20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f  (void *)pKeyInfo
17a30 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
17a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
17a50 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
17a60 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
17a70 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
17a80 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  T:.    default: 
17a90 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
17aa0 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e  3:    (SELECT ..
17ab0 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20  . FROM ...).    
17ac0 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20    **     or:    
17ad0 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e  EXISTS(SELECT ..
17ae0 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20  . FROM ...).    
17af0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
17b00 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65  r a SELECT, gene
17b10 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
17b20 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
17b30 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  all columns of. 
17b40 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
17b50 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72  t row into an ar
17b60 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
17b70 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
17b80 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a  index of.      *
17b90 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
17ba0 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ster..      **. 
17bb0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
17bc0 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
17bd0 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30  ite an integer 0
17be0 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
17bf0 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 20 20   1 (exists).    
17c00 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69    ** into a regi
17c10 73 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ster and return 
17c20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75  that register nu
17c30 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  mber..      **. 
17c40 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20       ** In both 
17c50 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72 79  cases, the query
17c60 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69   is augmented wi
17c70 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41  th "LIMIT 1".  A
17c80 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65  ny .      ** pre
17c90 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69  existing limit i
17ca0 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70  s discarded in p
17cb0 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20  lace of the new 
17cc0 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a  LIMIT 1..      *
17cd0 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
17ce0 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17d10 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
17d20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
17d30 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
17d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
17d50 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
17d60 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECT result */.
17d70 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20        int nReg; 
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17da0 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
17db0 63 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 45 78  cate */.      Ex
17dc0 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20  pr *pLimit;     
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74      /* New limit
17df0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a   expression */..
17e00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17e10 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
17e20 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
17e30 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
17e40 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
17e50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
17e60 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
17e70 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
17e80 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
17e90 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
17ea0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17eb0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
17ec0 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20   );..      pSel 
17ed0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
17ee0 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d  ct;.      nReg =
17ef0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
17f00 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45  ELECT ? pSel->pE
17f10 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b  List->nExpr : 1;
17f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
17f30 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
17f40 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  st, 0, pParse->n
17f50 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50  Mem+1);.      pP
17f60 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
17f70 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  eg;.      if( pE
17f80 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
17f90 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65  CT ){.        de
17fa0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d  st.eDest = SRT_M
17fb0 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  em;.        dest
17fc0 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53  .iSdst = dest.iS
17fd0 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64  DParm;.        d
17fe0 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67  est.nSdst = nReg
17ff0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18000 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18010 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e  P_Null, 0, dest.
18020 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53  iSDParm, dest.iS
18030 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20  DParm+nReg-1);. 
18040 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
18050 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
18060 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
18070 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18080 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
18090 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
180a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
180b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
180c0 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
180d0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
180e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
180f0 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
18100 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
18110 7d 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  }.      pLimit =
18120 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
18130 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  c(pParse->db, TK
18140 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c 69 74 65  _INTEGER,&sqlite
18150 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30  3IntTokens[1], 0
18160 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
18170 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  l->pLimit ){.   
18180 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18190 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
181a0 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d  b, pSel->pLimit-
181b0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
181c0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70   pSel->pLimit->p
181d0 4c 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  Left = pLimit;. 
181e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
181f0 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74      pSel->pLimit
18200 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
18210 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54  pParse, TK_LIMIT
18220 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  , pLimit, 0);.  
18230 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65 6c      }.      pSel
18240 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
18250 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
18260 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
18270 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  el, &dest) ){.  
18280 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
18290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52        }.      rR
182a0 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  eg = dest.iSDPar
182b0 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74  m;.      ExprSet
182c0 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
182d0 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
182e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
182f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
18300 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20  HasNullFlag ){. 
18310 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
18320 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70  NullFlag(v, pExp
18330 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e  r->iTable, rHasN
18340 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20  ullFlag);.  }.. 
18350 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69   if( jmpIfDynami
18360 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c>=0 ){.    sqli
18370 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
18380 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
18390 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
183a0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
183b0 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  se);..  return r
183c0 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Reg;.}.#endif /*
183d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
183e0 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
183f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
18400 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70  BQUERY./*.** Exp
18410 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e  r pIn is an IN(.
18420 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ..) expression. 
18430 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  This function ch
18440 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a  ecks that the .*
18450 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20  * sub-select on 
18460 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
18470 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73  N() operator has
18480 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
18490 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20   of .** columns 
184a0 61 73 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e  as the vector on
184b0 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66   the LHS. Or, if
184c0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
184d0 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  IN() is not .** 
184e0 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61  a sub-query, tha
184f0 74 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 76  t the LHS is a v
18500 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e  ector of size 1.
18510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
18520 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65  xprCheckIN(Parse
18530 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
18540 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63  pIn){.  int nVec
18550 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tor = sqlite3Exp
18560 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d  rVectorSize(pIn-
18570 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28  >pLeft);.  if( (
18580 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  pIn->flags & EP_
18590 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
185a0 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70    if( nVector!=p
185b0 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  In->x.pSelect->p
185c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
185d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
185e0 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
185f0 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65  se, pIn->x.pSele
18600 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
18610 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  r, nVector);.   
18620 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
18630 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
18640 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20  Vector!=1 ){.   
18650 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
18660 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
18670 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  In->pLeft);.    
18680 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
18690 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
186a0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
186b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
186c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
186d0 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65  code for an IN e
186e0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
186f0 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
18700 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20  CT ...).**      
18710 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
18720 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ue, ...).**.** T
18730 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
18740 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61  e (LHS) is a sca
18750 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78  lar or vector ex
18760 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a  pression.  The .
18770 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
18780 64 65 20 28 52 48 53 29 20 69 73 20 61 6e 20 61  de (RHS) is an a
18790 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20  rray of zero or 
187a0 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75  more scalar valu
187b0 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71  es, or a.** subq
187c0 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 52 48  uery.  If the RH
187d0 53 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  S is a subquery,
187e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
187f0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75  esult columns mu
18800 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20  st.** match the 
18810 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
18820 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20  s in the vector 
18830 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20  on the LHS.  If 
18840 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20  the RHS is.** a 
18850 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20  list of values, 
18860 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20  the LHS must be 
18870 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a  a scalar. .**.**
18880 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   The IN operator
18890 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
188a0 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e  LHS value is con
188b0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
188c0 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65  e RHS..** The re
188d0 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66  sult is false if
188e0 20 74 68 65 20 4c 48 53 20 69 73 20 64 65 66 69   the LHS is defi
188f0 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68  nitely not in th
18900 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20  e RHS.  The .** 
18910 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69  result is NULL i
18920 66 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  f the presence o
18930 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65  f the LHS in the
18940 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a   RHS cannot be .
18950 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75  ** determined du
18960 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a  e to NULLs..**.*
18970 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
18980 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
18990 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74  at jumps to dest
189a0 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c  IfFalse if the L
189b0 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  HS is not .** co
189c0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
189d0 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20  he RHS.  If due 
189e0 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e  to NULLs we cann
189f0 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ot determine if 
18a00 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f  the LHS.** is co
18a10 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
18a20 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  HS then jump to 
18a30 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
18a40 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
18a50 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ined.** within t
18a60 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c  he RHS then fall
18a70 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20   through..**.** 
18a80 53 65 65 20 74 68 65 20 73 65 70 61 72 61 74 65  See the separate
18a90 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20   in-operator.md 
18aa0 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69  documentation fi
18ab0 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69  le in the canoni
18ac0 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f  cal.** SQLite so
18ad0 75 72 63 65 20 74 72 65 65 20 66 6f 72 20 61 64  urce tree for ad
18ae0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
18af0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
18b00 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
18b10 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
18b20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
18b30 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
18b40 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
18b50 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
18b60 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
18b70 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
18b80 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
18b90 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
18ba0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
18bb0 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
18bc0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
18bd0 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
18be0 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
18bf0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
18c00 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
18c10 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
18c20 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
18c30 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
18c40 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
18c50 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
18c60 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
18c70 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  lues */.  int eT
18c80 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
18c90 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
18ca0 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73  HS */.  int rLhs
18cb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18cc0 20 52 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c   Register(s) hol
18cd0 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c  ding the LHS val
18ce0 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68  ues */.  int rLh
18cf0 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f  sOrig;         /
18d00 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69  * LHS values pri
18d10 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67  or to reordering
18d20 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20   by aiMap[] */. 
18d30 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
18d40 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
18d50 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
18d60 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
18d70 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20  *aiMap = 0;     
18d80 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65    /* Map from ve
18d90 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e  ctor field to in
18da0 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  dex column */.  
18db0 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20  char *zAff = 0; 
18dc0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
18dd0 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d  y string for com
18de0 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e  parisons */.  in
18df0 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20  t nVector;      
18e00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
18e10 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20  ectors for this 
18e20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
18e30 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20   int iDummy;    
18e40 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20         /* Dummy 
18e50 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70  parameter to exp
18e60 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f  rCodeVector() */
18e70 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20  .  Expr *pLeft; 
18e80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e90 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
18ea0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
18eb0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18ec0 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65    /* loop counte
18ed0 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  r */.  int destS
18ee0 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20  tep2;        /* 
18ef0 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68  Where to jump wh
18f00 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e  en NULLs seen in
18f10 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74   step 2 */.  int
18f20 20 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20   destStep6 = 0; 
18f30 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63     /* Start of c
18f40 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a  ode for Step 6 *
18f50 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75 74  /.  int addrTrut
18f60 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  hOp;      /* Add
18f70 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74  ress of opcode t
18f80 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74  hat determines t
18f90 68 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f  he IN is true */
18fa0 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75  .  int destNotNu
18fb0 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ll;      /* Jump
18fc0 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61   here if a compa
18fd0 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75  rison is not tru
18fe0 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20  e in step 6 */. 
18ff0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
19000 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
19010 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70   the step-6 loop
19020 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20   */ ..  pLeft = 
19030 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
19040 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
19050 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70  heckIN(pParse, p
19060 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  Expr) ) return;.
19070 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41    zAff = exprINA
19080 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
19090 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f  pExpr);.  nVecto
190a0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
190b0 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
190c0 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70  >pLeft);.  aiMap
190d0 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
190e0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  DbMallocZero(.  
190f0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
19100 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28  nVector*(sizeof(
19110 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68  int) + sizeof(ch
19120 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20  ar)) + 1.  );.  
19130 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
19140 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
19150 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
19160 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b  odeIN_oom_error;
19170 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
19180 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48  o compute the RH
19190 53 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74  S. After this st
191a0 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ep, if anything 
191b0 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  other than.  ** 
191c0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
191d0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74   returned, the t
191e0 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20  able opened ith 
191f0 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54  cursor pExpr->iT
19200 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  able .  ** conta
19210 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
19220 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
19230 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58  RHS. If IN_INDEX
19240 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
19250 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20  d,.  ** the RHS 
19260 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
19270 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20   coded.  */.  v 
19280 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19290 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
192a0 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
192b0 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
192c0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
192d0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
192e0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
192f0 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
19300 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
19310 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
19320 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19340 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d      IN_INDEX_MEM
19350 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44  BERSHIP | IN_IND
19360 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20  EX_NOOP_OK,.    
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46           destIfF
19390 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
193a0 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e   ? 0 : &rRhsHasN
193b0 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20  ull, aiMap);..  
193c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
193d0 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d  nErr || nVector=
193e0 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  =1 || eType==IN_
193f0 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20  INDEX_EPH.      
19400 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
19410 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c  DEX_INDEX_ASC ||
19420 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
19430 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29  _INDEX_DESC .  )
19440 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19450 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69  DEBUG.  /* Confi
19460 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20  rm that aiMap[] 
19470 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72  contains nVector
19480 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
19490 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20  between 0 and.  
194a0 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f  ** nVector-1. */
194b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
194c0 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
194d0 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20   int j, cnt;.   
194e0 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c   for(cnt=j=0; j<
194f0 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66  nVector; j++) if
19500 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20  ( aiMap[j]==i ) 
19510 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  cnt++;.    asser
19520 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d  t( cnt==1 );.  }
19530 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
19540 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
19550 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
19560 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49  pr> IN (...)". I
19570 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a  f the LHS is a .
19580 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65    ** vector, the
19590 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  n it is stored i
195a0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56  n an array of nV
195b0 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  ector registers 
195c0 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61  starting .  ** a
195d0 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t r1..  **.  ** 
195e0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
195f0 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20  ex() might have 
19600 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69  reordered the fi
19610 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20  elds of the LHS 
19620 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74  vector.  ** so t
19630 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61  hat the fields a
19640 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f  re in the same o
19650 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74  rder as an exist
19660 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65  ing index.   The
19670 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72  .  ** aiMap[] ar
19680 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ray contains a m
19690 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  apping from the 
196a0 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65  original LHS fie
196b0 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  ld order to.  **
196c0 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72   the field order
196d0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
196e0 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a  e RHS index..  *
196f0 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
19700 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
19710 3b 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65  ;.  rLhsOrig = e
19720 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
19730 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44  arse, pLeft, &iD
19740 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ummy);.  for(i=0
19750 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61  ; i<nVector && a
19760 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29  iMap[i]==i; i++)
19770 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69  {} /* Are LHS fi
19780 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20  elds reordered? 
19790 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63  */.  if( i==nVec
197a0 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48  tor ){.    /* LH
197b0 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  S fields are not
197c0 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
197d0 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69    rLhs = rLhsOri
197e0 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
197f0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64  /* Need to reord
19800 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64  er the LHS field
19810 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  s according to a
19820 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73  iMap */.    rLhs
19830 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19840 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
19850 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72  Vector);.    for
19860 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
19870 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
19880 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19890 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f  , OP_Copy, rLhsO
198a0 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61  rig+i, rLhs+aiMa
198b0 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p[i], 0);.    }.
198c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c    }..  /* If sql
198d0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
198e0 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f  ) did not find o
198f0 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  r create an inde
19900 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73  x that is.  ** s
19910 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c  uitable for eval
19920 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70  uating the IN op
19930 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61  erator, then eva
19940 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20  luate using a.  
19950 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ** sequence of c
19960 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a  omparisons..  **
19970 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74  .  ** This is st
19980 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e  ep (1) in the in
19990 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74  -operator.md opt
199a0 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d  imized algorithm
199b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
199c0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  pe==IN_INDEX_NOO
199d0 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  P ){.    ExprLis
199e0 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
199f0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43  ->x.pList;.    C
19a00 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
19a10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
19a20 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
19a30 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e  ->pLeft);.    in
19a40 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69  t labelOk = sqli
19a50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19a60 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c  (v);.    int r2,
19a70 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20   regToFree;.    
19a80 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20  int regCkNull = 
19a90 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  0;.    int ii;. 
19aa0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
19ab0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
19ac0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
19ad0 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74   );.    if( dest
19ae0 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
19af0 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67  lse ){.      reg
19b00 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  CkNull = sqlite3
19b10 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19b20 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
19b30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19b40 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20  P_BitAnd, rLhs, 
19b50 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  rLhs, regCkNull)
19b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
19b70 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e  ii=0; ii<pList->
19b80 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
19b90 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
19ba0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
19bb0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69  rse, pList->a[ii
19bc0 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46  ].pExpr, &regToF
19bd0 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ree);.      if( 
19be0 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c  regCkNull && sql
19bf0 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
19c00 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  l(pList->a[ii].p
19c10 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
19c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19c30 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
19c40 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20   regCkNull, r2, 
19c50 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
19c60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69    }.      if( ii
19c70 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
19c80 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  || destIfNull!=d
19c90 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
19ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19cb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71  eAddOp4(v, OP_Eq
19cc0 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c  , rLhs, labelOk,
19cd0 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
19cf0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
19d00 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
19d10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
19d20 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  (v, ii<pList->nE
19d30 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
19d40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
19d50 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78  , ii==pList->nEx
19d60 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73  pr-1);.        s
19d70 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19d80 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a  P5(v, zAff[0]);.
19d90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19da0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
19db0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
19dc0 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20  alse );.        
19dd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19de0 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
19df0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
19e00 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
19e20 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
19e30 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65  LLSEQ); VdbeCove
19e40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
19e50 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19e60 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20  geP5(v, zAff[0] 
19e70 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
19e80 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
19e90 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
19ea0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19eb0 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20  , regToFree);.  
19ec0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43    }.    if( regC
19ed0 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  kNull ){.      s
19ee0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19ef0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
19f00 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66  egCkNull, destIf
19f10 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
19f20 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
19f30 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
19f40 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
19f50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
19f60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
19f70 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20  (v, labelOk);.  
19f80 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19f90 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19fa0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
19fb0 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
19fc0 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b  CodeIN_finished;
19fd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
19fe0 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  2: Check to see 
19ff0 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61  if the LHS conta
1a000 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c  ins any NULL col
1a010 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20  umns.  If the.  
1a020 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74  ** LHS does cont
1a030 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74  ain NULLs then t
1a040 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
1a050 65 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f  e either FALSE o
1a060 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20  r NULL..  ** We 
1a070 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74  will then skip t
1a080 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
1a090 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   of the RHS..  *
1a0a0 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75  /.  if( destIfNu
1a0b0 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
1a0c0 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32  ){.    destStep2
1a0d0 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1a0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73    }else{.    des
1a0f0 74 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65  tStep2 = destSte
1a100 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p6 = sqlite3Vdbe
1a110 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a120 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
1a130 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
1a140 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
1a150 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
1a160 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
1a170 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ft, i);.    if( 
1a180 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
1a190 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20  Null(p) ){.     
1a1a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a1b0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1a1c0 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65   rLhs+i, destSte
1a1d0 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  p2);.      VdbeC
1a1e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1a1f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  }.  }..  /* Step
1a200 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20   3.  The LHS is 
1a210 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20  now known to be 
1a220 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68  non-NULL.  Do th
1a230 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a  e binary search.
1a240 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20    ** of the RHS 
1a250 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73  using the LHS as
1a260 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f   a probe.  If fo
1a270 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20  und, the result 
1a280 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20  is.  ** true..  
1a290 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1a2a0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
1a2b0 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
1a2c0 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
1a2d0 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  s the ROWID of t
1a2e0 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20  able b-tree and 
1a2f0 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a  so we also.    *
1a300 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  * know that the 
1a310 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e  RHS is non-NULL.
1a320 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62    Hence, we comb
1a330 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64 20  ine steps 3 and 
1a340 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20  4.    ** into a 
1a350 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a  single opcode. *
1a360 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1a370 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
1a380 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e  ekRowid, pExpr->
1a390 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
1a3a0 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20  lse, rLhs);.    
1a3b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a3c0 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
1a3d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a3e0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
1a3f0 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75  ;  /* Return Tru
1a400 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e */.  }else{.  
1a410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a420 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
1a430 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f  ty, rLhs, nVecto
1a440 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63  r, 0, zAff, nVec
1a450 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65  tor);.    if( de
1a460 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1a470 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f  fNull ){.      /
1a480 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33  * Combine Step 3
1a490 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f   and Step 5 into
1a4a0 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
1a4b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1a4c0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1a4d0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70  , OP_NotFound, p
1a4e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
1a4f0 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20  stIfFalse,.     
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1a520 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1a530 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge(v);.      got
1a540 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
1a550 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
1a560 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e    }.    /* Ordin
1a570 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20  ary Step 3, for 
1a580 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 46  the case where F
1a590 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72  ALSE and NULL ar
1a5a0 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
1a5b0 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20    addrTruthOp = 
1a5c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a5d0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
1a5e0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1a5f0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a610 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
1a620 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
1a630 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1a640 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66    /* Step 4.  If
1a650 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77   the RHS is know
1a660 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
1a670 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20   and we did not 
1a680 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74  find.  ** an mat
1a690 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  ch on the search
1a6a0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1a6b0 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
1a6c0 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66  FALSE..  */.  if
1a6d0 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26  ( rRhsHasNull &&
1a6e0 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20   nVector==1 ){. 
1a6f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a700 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
1a710 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
1a720 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1a730 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1a740 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1a750 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20  ep 5.  If we do 
1a760 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1a770 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1a780 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20  tween NULL and. 
1a790 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20   ** FALSE, then 
1a7a0 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73  just return fals
1a7b0 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e. .  */.  if( d
1a7c0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1a7d0 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33  IfNull ) sqlite3
1a7e0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
1a7f0 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20  IfFalse);..  /* 
1a800 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72  Step 6: Loop thr
1a810 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65  ough rows of the
1a820 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65   RHS.  Compare e
1a830 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c  ach row to the L
1a840 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20  HS..  ** If any 
1a850 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55  comparison is NU
1a860 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
1a870 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  ult is NULL.  If
1a880 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72   all.  ** compar
1a890 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20  isons are FALSE 
1a8a0 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72  then the final r
1a8b0 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a  esult is FALSE..
1a8c0 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20    **.  ** For a 
1a8d0 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69  scalar LHS, it i
1a8e0 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
1a8f0 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66  check just the f
1a900 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66  irst row.  ** of
1a910 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1a920 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29   if( destStep6 )
1a930 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a940 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1a950 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f  Step6);.  addrTo
1a960 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1a970 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
1a980 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
1a990 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  e, destIfFalse);
1a9a0 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
1a9b0 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  v);.  if( nVecto
1a9c0 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e  r>1 ){.    destN
1a9d0 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  otNull = sqlite3
1a9e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1a9f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1aa00 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31  * For nVector==1
1aa10 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  , combine steps 
1aa20 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64  6 and 7 by immed
1aa30 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67  iately returning
1aa40 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66  .    ** FALSE if
1aa50 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61   the first compa
1aa60 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c  rison is not NUL
1aa70 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74  L */.    destNot
1aa80 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c  Null = destIfFal
1aa90 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  se;.  }.  for(i=
1aaa0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
1aab0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
1aac0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
1aad0 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20  oll;.    int r3 
1aae0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1aaf0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1ab00 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74   p = sqlite3Vect
1ab10 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
1ab20 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43  Left, i);.    pC
1ab30 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1ab40 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1ab50 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
1ab60 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ab70 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  _Column, pExpr->
1ab80 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a  iTable, i, r3);.
1ab90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aba0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
1abb0 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e  rLhs+i, destNotN
1abc0 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  ull, r3,.       
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1abe0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1abf0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64  COLLSEQ);.    Vd
1ac00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1ac10 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1ac20 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1ac30 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   r3);.  }.  sqli
1ac40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ac50 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1ac60 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20  tIfNull);.  if( 
1ac70 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1ac80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1ac90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1aca0 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  NotNull);.    sq
1acb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1acc0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70  v, OP_Next, pExp
1acd0 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 54  r->iTable, addrT
1ace0 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43  op+1);.    VdbeC
1acf0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
1ad00 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66 20   /* Step 7:  If 
1ad10 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1ad20 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61  int, we know tha
1ad30 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  t the result mus
1ad40 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c 73  t.    ** be fals
1ad50 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1ad60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ad70 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
1ad80 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  fFalse);.  }..  
1ad90 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69 6e  /* Jumps here in
1ada0 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72 6e   order to return
1adb0 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69   true. */.  sqli
1adc0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1add0 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29 3b  v, addrTruthOp);
1ade0 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ..sqlite3ExprCod
1adf0 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  eIN_finished:.  
1ae00 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72  if( rLhs!=rLhsOr
1ae10 69 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  ig ) sqlite3Rele
1ae20 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1ae30 65 2c 20 72 4c 68 73 29 3b 0a 20 20 73 71 6c 69  e, rLhs);.  sqli
1ae40 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1ae50 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43  pParse);.  VdbeC
1ae60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
1ae70 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c 69  IN expr"));.sqli
1ae80 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f  te3ExprCodeIN_oo
1ae90 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  m_error:.  sqlit
1aea0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1aeb0 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73  >db, aiMap);.  s
1aec0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1aed0 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a  rse->db, zAff);.
1aee0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1aef0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1af00 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
1af10 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1af20 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65  G_POINT./*.** Ge
1af30 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
1af40 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
1af50 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67  put the floating
1af60 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20   point.** value 
1af70 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30  described by z[0
1af80 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
1af90 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
1afa0 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
1afb0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
1afc0 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
1afd0 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
1afe0 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
1aff0 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
1b000 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
1b010 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
1b020 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
1b030 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
1b040 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
1b050 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65  atic void codeRe
1b060 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  al(Vdbe *v, cons
1b070 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1b080 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
1b090 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Mem){.  if( ALWA
1b0a0 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20  YS(z!=0) ){.    
1b0b0 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
1b0c0 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
1b0d0 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
1b0e0 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
1b0f0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61  ITE_UTF8);.    a
1b100 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
1b110 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
1b120 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
1b130 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
1b140 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
1b150 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
1b160 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c   -value;.    sql
1b170 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
1b180 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30  p8(v, OP_Real, 0
1b190 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
1b1a0 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29  &value, P4_REAL)
1b1b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
1b1c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b1d0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1b1e0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
1b1f0 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
1b200 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
1b210 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
1b220 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
1b230 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69   Expr.u.zToken i
1b240 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e  s always UTF8 an
1b250 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  d zero-terminate
1b260 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
1b270 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61  d codeInteger(Pa
1b280 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1b290 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
1b2a0 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
1b2b0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1b2c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1b2d0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
1b2e0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
1b2f0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
1b300 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
1b310 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
1b320 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
1b330 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
1b340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b350 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1b360 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
1b370 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  se{.    int c;. 
1b380 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
1b390 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1b3a0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
1b3b0 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  n;.    assert( z
1b3c0 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73  !=0 );.    c = s
1b3d0 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
1b3e0 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  I64(z, &value);.
1b3f0 20 20 20 20 69 66 28 20 28 63 3d 3d 33 20 26 26      if( (c==3 &&
1b400 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 63   !negFlag) || (c
1b410 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46 6c 61 67  ==2) || (negFlag
1b420 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c   && value==SMALL
1b430 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69 66  EST_INT64)){.#if
1b440 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b450 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1b460 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b470 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76  rMsg(pParse, "ov
1b480 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a  ersized integer:
1b490 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20   %s%s", negFlag 
1b4a0 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a  ? "-" : "", z);.
1b4b0 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  #else.#ifndef SQ
1b4c0 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e  LITE_OMIT_HEX_IN
1b4d0 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20  TEGER.      if( 
1b4e0 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
1b4f0 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b  (z,"0x",2)==0 ){
1b500 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b510 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1b520 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f   "hex literal to
1b530 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20 6e 65  o big: %s%s", ne
1b540 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b  gFlag?"-":"",z);
1b550 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
1b560 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
1b570 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1b580 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  z, negFlag, iMem
1b590 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1b5a0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
1b5b0 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
1b5c0 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 33 20 3f  { value = c==3 ?
1b5d0 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
1b5e0 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20  : -value; }.    
1b5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b600 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e  Op4Dup8(v, OP_In
1b610 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
1b620 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
1b630 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a 20  _INT64);.    }. 
1b640 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73   }.}../*.** Eras
1b650 65 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 20 65  e column-cache e
1b660 6e 74 72 79 20 6e 75 6d 62 65 72 20 69 0a 2a 2f  ntry number i.*/
1b670 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
1b680 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
1b690 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1b6a0 69 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  i){.  if( pParse
1b6b0 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74  ->aColCache[i].t
1b6c0 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
1b6d0 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
1b6e0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
1b6f0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
1b700 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
1b710 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
1b720 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
1b730 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1b740 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a  [i].iReg;.    }.
1b750 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43    }.  pParse->nC
1b760 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69 66 28  olCache--;.  if(
1b770 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
1b780 61 63 68 65 20 29 7b 0a 20 20 20 20 70 50 61 72  ache ){.    pPar
1b790 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1b7a0 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   = pParse->aColC
1b7b0 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f  ache[pParse->nCo
1b7c0 6c 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  lCache];.  }.}..
1b7d0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e  ./*.** Record in
1b7e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b7f0 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75  e that a particu
1b800 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  lar column from 
1b810 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20  a.** particular 
1b820 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20  table is stored 
1b830 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  in a particular 
1b840 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69  register..*/.voi
1b850 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1b860 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70  heStore(Parse *p
1b870 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c  Parse, int iTab,
1b880 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69   int iCol, int i
1b890 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
1b8a0 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69   int minLru;.  i
1b8b0 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72  nt idxLru;.  str
1b8c0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1b8d0 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61  ;..  /* Unless a
1b8e0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
1b8f0 72 72 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e  rred, register n
1b900 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79  umbers are alway
1b910 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20  s positive. */. 
1b920 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20   assert( iReg>0 
1b930 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
1b940 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
1b950 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1b960 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d   assert( iCol>=-
1b970 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20  1 && iCol<32768 
1b980 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f  );  /* Finite co
1b990 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  lumn numbers */.
1b9a0 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45  .  /* The SQLITE
1b9b0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61  _ColumnCache fla
1b9c0 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63  g disables the c
1b9d0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68  olumn cache.  Th
1b9e0 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20  is is used.  ** 
1b9f0 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  for testing only
1ba00 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61   - to verify tha
1ba10 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20  t SQLite always 
1ba20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e  gets the same an
1ba30 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61  swer.  ** with a
1ba40 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63  nd without the c
1ba50 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
1ba60 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
1ba70 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61  tionDisabled(pPa
1ba80 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
1ba90 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72  ColumnCache) ) r
1baa0 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72  eturn;..  /* Fir
1bab0 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65  st replace any e
1bac0 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20  xisting entry.. 
1bad0 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
1bae0 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63  y, the way the c
1baf0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63  olumn cache is c
1bb00 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77  urrently used, w
1bb10 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  e are guaranteed
1bb20 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f  .  ** that the o
1bb30 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72  bject will never
1bb40 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63   already be in c
1bb50 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68  ache.  Verify th
1bb60 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20  is guarantee..  
1bb70 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1bb80 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  G.  for(i=0, p=p
1bb90 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1bba0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
1bbb0 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29  Cache; i++, p++)
1bbc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1bbd0 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c  >iTable!=iTab ||
1bbe0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f   p->iColumn!=iCo
1bbf0 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
1bc00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
1bc10 68 65 20 69 73 20 61 6c 72 65 61 64 79 20 66 75  he is already fu
1bc20 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  ll, delete the l
1bc30 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73  east recently us
1bc40 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 66  ed entry */.  if
1bc50 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  ( pParse->nColCa
1bc60 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f 43 4f  che>=SQLITE_N_CO
1bc70 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20 6d 69  LCACHE ){.    mi
1bc80 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66  nLru = 0x7ffffff
1bc90 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20 3d 20  f;.    idxLru = 
1bca0 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  -1;.    for(i=0,
1bcb0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1bcc0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
1bcd0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
1bce0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
1bcf0 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b  p->lru<minLru ){
1bd00 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72 75 20  .        idxLru 
1bd10 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = i;.        min
1bd20 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20  Lru = p->lru;.  
1bd30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bd40 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
1bd50 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
1bd60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
1bd70 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
1bd80 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  che[pParse->nCol
1bd90 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20  Cache++];.  }.. 
1bda0 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
1bdb0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65 6e 64  entry to the end
1bdc0 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 2a 2f   of the cache */
1bdd0 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70  .  p->iLevel = p
1bde0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1bdf0 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  el;.  p->iTable 
1be00 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69 43 6f  = iTab;.  p->iCo
1be10 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 70  lumn = iCol;.  p
1be20 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
1be30 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
1be40 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72  .  p->lru = pPar
1be50 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
1be60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
1be70 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
1be80 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
1be90 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
1bea0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
1beb0 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
1bec0 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
1bed0 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
1bee0 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
1bef0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1bf00 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
1bf10 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1bf20 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
1bf30 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt i = 0;.  whil
1bf40 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e( i<pParse->nCo
1bf50 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 73 74  lCache ){.    st
1bf60 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1bf70 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
1bf80 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20 69  lCache[i];.    i
1bf90 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52  f( p->iReg >= iR
1bfa0 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20 3c 20  eg && p->iReg < 
1bfb0 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20  iReg+nReg ){.   
1bfc0 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
1bfd0 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ar(pParse, i);. 
1bfe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bff0 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  i++;.    }.  }.}
1c000 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
1c010 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
1c020 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
1c030 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
1c040 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
1c050 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
1c060 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
1c070 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
1c080 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
1c090 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
1c0a0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
1c0b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c0c0 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
1c0d0 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
1c0e0 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23  iCacheLevel++;.#
1c0f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c100 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1c110 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1c120 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1c130 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1c140 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c  ("PUSH to %d\n",
1c150 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1c160 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
1c170 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
1c180 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
1c190 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
1c1a0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
1c1b0 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
1c1c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71   the previous sq
1c1d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1c1e0 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49  sh operation.  I
1c1f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
1c200 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61  estore.** the ca
1c210 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  che to the state
1c220 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72   it was in prior
1c230 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1c240 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73   Push..*/.void s
1c250 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1c260 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
1c270 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
1c280 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1c290 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31  ->iCacheLevel>=1
1c2a0 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43   );.  pParse->iC
1c2b0 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66  acheLevel--;.#if
1c2c0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1c2d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
1c2e0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1c2f0 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
1c300 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
1c310 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70  POP  to %d\n", p
1c320 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1c330 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  el);.  }.#endif.
1c340 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73    while( i<pPars
1c350 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a  e->nColCache ){.
1c360 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1c370 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 4c 65  aColCache[i].iLe
1c380 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63  vel>pParse->iCac
1c390 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20  heLevel ){.     
1c3a0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
1c3b0 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20  (pParse, i);.   
1c3c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b   }else{.      i+
1c3d0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
1c3e0 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
1c3f0 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
1c400 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
1c410 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
1c420 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
1c430 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
1c440 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
1c450 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
1c460 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
1c470 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
1c480 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
1c490 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
1c4a0 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
1c4b0 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
1c4c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1c4d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
1c4e0 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
1c4f0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
1c500 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
1c510 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1c520 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
1c530 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1c540 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1c550 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1c560 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1c570 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
1c580 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
1c590 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
1c5a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1c5b0 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20   that will load 
1c5c0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65  into register re
1c5d0 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61  gOut a value tha
1c5e0 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69  t is.** appropri
1c5f0 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78  ate for the iIdx
1c600 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1c610 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a   index pIdx..*/.
1c620 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c630 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c  CodeLoadIndexCol
1c640 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1c650 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61  arse,  /* The pa
1c660 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c670 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
1c680 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1c690 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20  whose column is 
1c6a0 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
1c6b0 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
1c6c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1c6d0 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
1c6e0 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  row */.  int iId
1c6f0 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20  xCol,    /* The 
1c700 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1c710 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64  dex to be loaded
1c720 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1c730 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
1c740 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
1c750 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
1c760 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
1c770 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64  16 iTabCol = pId
1c780 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78  x->aiColumn[iIdx
1c790 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62  Col];.  if( iTab
1c7a0 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  Col==XN_EXPR ){.
1c7b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1c7c0 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20  ->aColExpr );.  
1c7d0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1c7e0 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e  aColExpr->nExpr>
1c7f0 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70  iIdxCol );.    p
1c800 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1c810 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b 0a 20  = iTabCur + 1;. 
1c820 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1c830 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
1c840 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
1c850 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c  [iIdxCol].pExpr,
1c860 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 70 50   regOut);.    pP
1c870 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
1c880 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c890 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c8a0 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1c8b0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1c8c0 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54  pIdx->pTable, iT
1c8d0 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8f0 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 43             iTabC
1c900 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
1c910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c920 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
1c930 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
1c940 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
1c950 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
1c960 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c970 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1c980 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
1c990 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
1c9a0 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
1c9b0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
1c9c0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
1c9d0 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
1c9e0 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
1c9f0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
1ca00 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1ca10 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68  e cursor.  Or th
1ca20 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20  e PK cursor for 
1ca30 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f  WITHOUT ROWID */
1ca40 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
1ca50 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1ca60 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  he column to ext
1ca70 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ract */.  int re
1ca80 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74  gOut      /* Ext
1ca90 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69  ract the value i
1caa0 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
1cab0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54  r */.){.  if( pT
1cac0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
1cad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1cae0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
1caf0 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  bCur, iCol, regO
1cb00 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ut);.    return;
1cb10 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c  .  }.  if( iCol<
1cb20 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  0 || iCol==pTab-
1cb30 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  >iPKey ){.    sq
1cb40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cb50 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1cb60 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCur, regOut);. 
1cb70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1cb80 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
1cb90 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
1cba0 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
1cbb0 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b     int x = iCol;
1cbc0 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
1cbd0 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73 56  id(pTab) && !IsV
1cbe0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1cbf0 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
1cc00 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73  3ColumnOfIndex(s
1cc10 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1cc20 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f  Index(pTab), iCo
1cc30 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
1cc40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cc50 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20  v, op, iTabCur, 
1cc60 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  x, regOut);.  }.
1cc70 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
1cc80 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
1cc90 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
1cca0 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  b, iCol, regOut)
1ccb0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1ccc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1ccd0 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
1cce0 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
1ccf0 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
1cd00 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
1cd10 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
1cd20 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ue in a register
1cd30 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f  . .**.** An effo
1cd40 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74  rt is made to st
1cd50 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
1cd60 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1cd70 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20   iReg.  This.** 
1cd80 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65 65  is not garanteee
1cd90 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28  d for GetColumn(
1cda0 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20 63  ) - the result c
1cdb0 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a  an be stored in.
1cdc0 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72 2e  ** any register.
1cdd0 20 20 42 75 74 20 74 68 65 20 72 65 73 75 6c 74    But the result
1cde0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1cdf0 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73 74  o land in regist
1ce00 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47  er iReg.** for G
1ce10 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e  etColumnToReg().
1ce20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
1ce30 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
1ce40 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
1ce50 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
1ce60 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
1ce70 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
1ce80 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
1ce90 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
1cea0 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
1ceb0 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
1cec0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1ced0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1cee0 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
1cef0 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1cf00 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1cf10 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1cf20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1cf30 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1cf40 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
1cf50 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
1cf60 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
1cf70 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
1cf80 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1cf90 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
1cfa0 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1cfb0 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
1cfc0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
1cfd0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1cfe0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1cff0 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
1d000 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
1d010 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20  for OP_Column + 
1d020 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64  FLAGS */.){.  Vd
1d030 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d040 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1d050 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1d060 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
1d070 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1d080 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1d090 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1d0a0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
1d0b0 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  p->iTable==iTabl
1d0c0 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
1d0d0 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
1d0e0 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
1d0f0 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
1d100 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d110 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
1d120 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
1d130 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1d140 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
1d150 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
1d160 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
1d170 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1d180 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
1d190 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
1d1a0 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
1d1b0 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
1d1c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1d1d0 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  , p5);.  }else{ 
1d1e0 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78    .    sqlite3Ex
1d1f0 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1d200 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
1d210 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
1d220 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
1d230 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
1d240 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54  prCodeGetColumnT
1d250 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a 70  oReg(.  Parse *p
1d260 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
1d270 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1d280 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1d290 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1d2a0 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
1d2b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1d2c0 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
1d2d0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1d2e0 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
1d2f0 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1d300 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
1d310 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
1d320 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1d330 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
1d340 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1d350 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
1d360 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
1d370 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  /.){.  int r1 = 
1d380 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1d390 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1d3a0 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20   pTab, iColumn, 
1d3b0 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30 29  iTable, iReg, 0)
1d3c0 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65 67  ;.  if( r1!=iReg
1d3d0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
1d3e0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
1d3f0 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  be, OP_SCopy, r1
1d400 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iReg);.}.../*.
1d410 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
1d420 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
1d430 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1d440 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1d450 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1d460 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65  .  int i;..#ifde
1d470 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d480 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
1d490 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1d4a0 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
1d4b0 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c  {.    printf("CL
1d4c0 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e  EAR\n");.  }.#en
1d4d0 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  dif.  for(i=0; i
1d4e0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1d4f0 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  he; i++){.    if
1d500 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  ( pParse->aColCa
1d510 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 0a 20  che[i].tempReg. 
1d520 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e      && pParse->n
1d530 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1d540 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1d550 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  eg).    ){.     
1d560 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
1d570 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
1d580 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d  Reg++] = pParse-
1d590 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
1d5a0 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  eg;.    }.  }.  
1d5b0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1d5c0 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
1d5d0 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
1d5e0 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
1d5f0 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
1d600 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
1d610 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
1d620 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
1d630 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d640 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1d650 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
1d660 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
1d670 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
1d680 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1d690 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1d6a0 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74  , iStart, iCount
1d6b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1d6c0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
1d6d0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
1d6e0 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
1d6f0 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
1d700 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
1d710 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
1d720 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1d730 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
1d740 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1d750 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
1d760 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
1d770 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
1d780 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Reg){.  assert( 
1d790 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
1d7a0 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
1d7b0 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
1d7c0 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
1d7d0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
1d7e0 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
1d7f0 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg);.  sqlite3Ex
1d800 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1d810 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65  arse, iFrom, nRe
1d820 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  g);.}..#if defin
1d830 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1d840 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1d850 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1d860 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1d870 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
1d880 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
1d890 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
1d8a0 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
1d8b0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1d8c0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1d8d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d8e0 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ne is used withi
1d8f0 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
1d900 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
1d910 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65   only.** and doe
1d920 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
1d930 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  a normal build..
1d940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
1d950 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1d960 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1d970 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
1d980 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  o){.  int i;.  s
1d990 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1d9a0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
1d9b0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1d9c0 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1d9d0 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1d9e0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
1d9f0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
1da00 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
1da10 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20  iTo ) return 1; 
1da20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
1da30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1da40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1da50 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54  E_DEBUG || SQLIT
1da60 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20  E_COVERAGE_TEST 
1da70 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  */.../*.** Conve
1da80 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  rt a scalar expr
1da90 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61  ession node to a
1daa0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66   TK_REGISTER ref
1dab0 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69  erencing.** regi
1dac0 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20  ster iReg.  The 
1dad0 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
1dae0 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72  re that iReg alr
1daf0 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  eady contains.**
1db00 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1db10 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ue for the expre
1db20 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssion..*/.static
1db30 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69   void exprToRegi
1db40 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  ster(Expr *p, in
1db50 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70  t iReg){.  p->op
1db60 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e  2 = p->op;.  p->
1db70 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
1db80 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20  ;.  p->iTable = 
1db90 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61  iReg;.  ExprClea
1dba0 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  rProperty(p, EP_
1dbb0 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Skip);.}../*.** 
1dbc0 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  Evaluate an expr
1dbd0 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61  ession (either a
1dbe0 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61   vector or a sca
1dbf0 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20  lar expression) 
1dc00 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65  and store.** the
1dc10 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69   result in conti
1dc20 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79  nguous temporary
1dc30 20 72 65 67 69 73 74 65 72 73 2e 20 20 52 65 74   registers.  Ret
1dc40 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1dc50 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65  .** the first re
1dc60 67 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 73  gister used to s
1dc70 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e  tore the result.
1dc80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1dc90 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65  turned result re
1dca0 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
1dcb0 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68  orary scalar, th
1dcc0 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a  en also write.**
1dcd0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e   that register n
1dce0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72  umber into *piFr
1dcf0 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20  eeable.  If the 
1dd00 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1dd10 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e  register.** is n
1dd20 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  ot a temporary o
1dd30 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
1dd40 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20  ion is a vector 
1dd50 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a  set *piFreeable.
1dd60 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  ** to 0..*/.stat
1dd70 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56  ic int exprCodeV
1dd80 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  ector(Parse *pPa
1dd90 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  rse, Expr *p, in
1dda0 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a  t *piFreeable){.
1ddb0 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20    int iResult;. 
1ddc0 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73   int nResult = s
1ddd0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
1dde0 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e  Size(p);.  if( n
1ddf0 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20  Result==1 ){.   
1de00 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1de10 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1de20 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65  Parse, p, piFree
1de30 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
1de40 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20      *piFreeable 
1de50 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
1de60 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
1de70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  .#if SQLITE_OMIT
1de80 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
1de90 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6c  iResult = 0;.#el
1dea0 73 65 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74  se.      iResult
1deb0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
1dec0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
1ded0 70 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  p, 0, 0);.#endif
1dee0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1def0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1df00 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d  Result = pParse-
1df10 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
1df20 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1df30 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f  Result;.      fo
1df40 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
1df50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1df60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46  sqlite3ExprCodeF
1df70 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72 73 65  actorable(pParse
1df80 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  , p->x.pList->a[
1df90 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73  i].pExpr, i+iRes
1dfa0 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ult);.      }.  
1dfb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1dfc0 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a   iResult;.}.../*
1dfd0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1dfe0 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
1dff0 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
1e000 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
1e010 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
1e020 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
1e030 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
1e040 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
1e050 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1e060 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
1e070 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
1e080 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
1e090 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
1e0a0 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
1e0b0 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
1e0c0 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
1e0d0 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
1e0e0 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
1e0f0 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
1e100 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
1e110 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
1e120 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
1e130 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
1e140 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
1e150 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
1e160 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
1e170 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
1e180 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
1e190 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1e1a0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1e1b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e1c0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1e1d0 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
1e1e0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1e1f0 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
1e200 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1e210 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
1e240 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1e250 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
1e260 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
1e270 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
1e280 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
1e290 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
1e2a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1e2b0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1e2c0 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1e2d0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1e2e0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1e2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1e300 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1e310 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1e320 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
1e330 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  , r2;           
1e340 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
1e350 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
1e360 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e380 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
1e390 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20  ession node */. 
1e3a0 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20   int p5 = 0;..  
1e3b0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1e3c0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1e3d0 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1e3e0 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
1e3f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1e400 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e410 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1e420 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
1e430 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
1e440 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
1e450 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
1e460 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
1e470 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1e480 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1e490 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1e4a0 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
1e4b0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1e4c0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1e4d0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1e4e0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1e4f0 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
1e500 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
1e510 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
1e520 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e530 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
1e540 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e550 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
1e560 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
1e570 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
1e580 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
1e590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1e5a0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1e5b0 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
1e5c0 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1e5f0 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
1e600 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1e610 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e620 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68    }.      /* Oth
1e630 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
1e640 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f  u into the TK_CO
1e650 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20  LUMN case */.   
1e660 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1e670 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
1e680 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d  nt iTab = pExpr-
1e690 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69  >iTable;.      i
1e6a0 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20  f( iTab<0 ){.   
1e6b0 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
1e6c0 3e 69 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20  >iSelfTab<0 ){. 
1e6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
1e6e0 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e  rating CHECK con
1e6f0 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65  straints or inse
1e700 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69  rting into parti
1e710 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  al index */.    
1e720 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1e730 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50  pr->iColumn - pP
1e740 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a  arse->iSelfTab;.
1e750 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e760 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69           /* Codi
1e770 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
1e780 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
1e790 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20   an index where 
1e7a0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20  column names.   
1e7b0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
1e7c0 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20   index refer to 
1e7d0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69  the table to whi
1e7e0 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c  ch the index bel
1e7f0 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ongs */.        
1e800 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d    iTab = pParse-
1e810 3e 69 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20  >iSelfTab - 1;. 
1e820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e830 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1e840 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1e850 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
1e860 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20  Expr->pTab,.    
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1e890 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  ->iColumn, iTab,
1e8a0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1e8d0 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  p2);.    }.    c
1e8e0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1e8f0 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1e900 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1e910 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1e920 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e930 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
1e940 73 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a  se TK_TRUEFALSE:
1e950 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e960 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e970 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65  _Integer, sqlite
1e980 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
1e990 70 45 78 70 72 29 2c 20 74 61 72 67 65 74 29 3b  pExpr), target);
1e9a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e9b0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
1e9c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e9d0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1e9e0 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
1e9f0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1ea00 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1ea10 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1ea20 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1ea30 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
1ea40 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
1ea50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1ea60 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1ea70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1ea80 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1ea90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1eaa0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1eab0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1eac0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
1ead0 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1eae0 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45  ng(v, target, pE
1eaf0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1eb00 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1eb10 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1eb20 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
1eb30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eb40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1eb50 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1eb60 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1eb70 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1eb80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
1eb90 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
1eba0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
1ebb0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
1ebc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
1ebd0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
1ebe0 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
1ebf0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1ec00 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1ec10 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1ec20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1ec30 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
1ec40 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
1ec50 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
1ec60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1ec70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
1ec80 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
1ec90 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
1eca0 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
1ecb0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1ecc0 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
1ecd0 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
1ece0 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
1ecf0 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
1ed00 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
1ed10 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
1ed20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ed30 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
1ed40 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
1ed50 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
1ed60 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  IC);.      retur
1ed70 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1ed80 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1ed90 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
1eda0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1edb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1edc0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1edd0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1ede0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1edf0 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
1ee00 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1ee10 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
1ee20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ee30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
1ee40 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
1ee50 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
1ee60 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1ee70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
1ee80 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1ee90 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1eea0 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
1eeb0 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
1eec0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1eed0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1eee0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1eef0 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74  en[0]=='?' || st
1ef00 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  rcmp(pExpr->u.zT
1ef10 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20  oken, z)==0 );. 
1ef20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
1ef30 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a  VList[0] = 0; /*
1ef40 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20   Indicate VList 
1ef50 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  may no longer be
1ef60 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20   enlarged */.   
1ef70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ef80 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61  AppendP4(v, (cha
1ef90 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29  r*)z, P4_STATIC)
1efa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1efb0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1efc0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1efd0 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
1efe0 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
1eff0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23  >iTable;.    }.#
1f000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f010 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1f020 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1f030 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1f040 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1f050 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1f060 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
1f070 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1f080 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1f090 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f0a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f0b0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1f0c0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
1f0d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f0e0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
1f0f0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1f100 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
1f110 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
1f120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f130 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c  dOp2(v, OP_Cast,
1f140 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
1f170 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
1f180 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  oken, 0));.     
1f190 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
1f1a0 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
1f1b0 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
1f1c0 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
1f1d0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1f1e0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1f1f0 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
1f200 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67      return inReg
1f210 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1f220 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
1f230 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
1f240 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1f250 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f  K_ISNOT:.      o
1f260 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1f270 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1f280 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49  .      p5 = SQLI
1f290 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
1f2a0 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68   /* fall-through
1f2b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1f2c0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1f2d0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1f2e0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1f2f0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1f300 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1f310 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EQ: {.      Expr
1f320 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
1f330 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66  >pLeft;.      if
1f340 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1f350 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a  ector(pLeft) ){.
1f360 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74          codeVect
1f370 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  orCompare(pParse
1f380 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
1f390 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20   op, p5);.      
1f3a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1f3b0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1f3c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f3d0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f3e0 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1f3f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f400 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f410 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1f420 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ree2);.        c
1f430 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1f440 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  e, pLeft, pExpr-
1f450 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1f460 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1f470 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
1f480 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20  TOREP2 | p5);.  
1f490 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f4a0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1f4b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1f4c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f4d0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1f4e0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f4f0 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1f500 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1f510 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f520 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1f530 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f540 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
1f550 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
1f560 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f570 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
1f580 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f590 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1f5a0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1f5b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f5c0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1f5d0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f5e0 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1f5f0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1f600 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f610 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1f620 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f630 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
1f640 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
1f650 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f660 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
1f670 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f680 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f690 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f6a0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1f6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1f6c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f6d0 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
1f6e0 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
1f6f0 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
1f700 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
1f710 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
1f720 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
1f730 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
1f740 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
1f750 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
1f760 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
1f770 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
1f780 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
1f790 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
1f7a0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
1f7b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
1f7c0 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20  D==OP_And );    
1f7d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f7e0 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
1f7f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f800 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20  _OR==OP_Or );   
1f810 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f820 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
1f830 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f840 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
1f850 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73  );           tes
1f860 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
1f870 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
1f880 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
1f890 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20  _Subtract );    
1f8a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f8b0 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
1f8c0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
1f8d0 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
1f8e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f8f0 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
1f900 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1f910 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
1f920 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f930 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
1f940 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f950 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
1f960 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74  itOr );        t
1f970 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f980 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  BITOR );.      a
1f990 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
1f9a0 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20  =OP_Divide );   
1f9b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f9c0 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
1f9d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1f9e0 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
1f9f0 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  eft );   testcas
1fa00 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
1fa10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fa20 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
1fa30 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74  ShiftRight );  t
1fa40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fa50 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
1fa60 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
1fa70 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20  T==OP_Concat ); 
1fa80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1fa90 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
1faa0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fab0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1fac0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fad0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1fae0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1faf0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1fb00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1fb10 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1fb20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1fb30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1fb40 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1fb50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fb60 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1fb70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fb80 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1fb90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fba0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fbb0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
1fbc0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1fbd0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1fbe0 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
1fbf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
1fc00 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
1fc10 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
1fc20 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1fc30 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
1fc40 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1fc50 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e  urn target;.#ifn
1fc60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fc70 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1fc80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1fc90 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
1fca0 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
1fcb0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1fcc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1fcd0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1fce0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1fcf0 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
1fd00 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 1, target);. 
1fd10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1fd20 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rget;.#endif.   
1fd30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fd40 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f    tempX.op = TK_
1fd50 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20  INTEGER;.       
1fd60 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45   tempX.flags = E
1fd70 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f  P_IntValue|EP_To
1fd80 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20  kenOnly;.       
1fd90 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20   tempX.u.iValue 
1fda0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20  = 0;.        r1 
1fdb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fdc0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74  eTemp(pParse, &t
1fdd0 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
1fde0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1fdf0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1fe00 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1fe10 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1fe20 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
1fe30 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1fe40 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
1fe50 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1fe60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fe70 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1fe80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1fe90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fea0 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
1feb0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1fec0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1fed0 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
1fee0 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
1fef0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
1ff00 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
1ff10 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
1ff20 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
1ff30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1ff40 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1ff50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ff60 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ff70 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1ff80 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1ff90 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1ffa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1ffb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ffc0 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
1ffd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ffe0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fff0 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
20000 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a  nt isTrue;    /*
20010 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e   IS TRUE or IS N
20020 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
20030 20 69 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20   int bNormal;   
20040 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
20050 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
20060 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
20070 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
20080 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
20090 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
200a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
200b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
200c0 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33  isTrue = sqlite3
200d0 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
200e0 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
200f0 20 20 20 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70       bNormal = p
20100 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53  Expr->op2==TK_IS
20110 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20120 28 20 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72  ( isTrue && bNor
20130 6d 61 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  mal);.      test
20140 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
20150 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
20160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20170 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72  p4Int(v, OP_IsTr
20180 75 65 2c 20 72 31 2c 20 69 6e 52 65 67 2c 20 21  ue, r1, inReg, !
20190 69 73 54 72 75 65 2c 20 69 73 54 72 75 65 20 5e  isTrue, isTrue ^
201a0 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
201b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
201c0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
201d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
201e0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
201f0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
20200 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
20210 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
20220 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
20230 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
20240 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
20250 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
20260 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
20270 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
20280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20290 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
202a0 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
202b0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
202c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
202d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
202e0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
202f0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
20300 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
20310 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
20320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20330 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
20340 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
20350 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
20360 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
20370 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
20380 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
20390 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
203a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
203b0 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
203c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
203d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
203e0 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
203f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20400 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
20410 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
20420 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
20430 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
20440 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
20450 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
20460 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20470 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
20480 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
20490 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
204a0 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
204b0 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
204c0 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75   %s()", pExpr->u
204d0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
204e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
204f0 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75  eturn pInfo->aFu
20500 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
20510 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iMem;.      }.  
20520 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20530 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
20540 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
20550 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
20560 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
20570 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
20580 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
20590 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20   nFarg;         
205a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
205b0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
205c0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  nts */.      Fun
205d0 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
205e0 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
205f0 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ion definition o
20600 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63  bject */.      c
20610 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
20620 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
20630 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
20640 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73      u32 constMas
20650 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61  k = 0;     /* Ma
20660 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  sk of function a
20670 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72  rguments that ar
20680 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  e constant */.  
20690 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
206a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
206b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
206c0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
206d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
206e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
206f0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
20700 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
20710 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  db);      /* The
20720 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75   text encoding u
20730 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61  sed by this data
20740 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f  base */.      Co
20750 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
20760 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74  ;    /* A collat
20770 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
20780 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e 73 74  .      if( Const
20790 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
207a0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
207b0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
207c0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
207d0 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69     /* SQL functi
207e0 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70 65 6e  ons can be expen
207f0 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74 6f 20  sive. So try to 
20800 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20 66 75  move constant fu
20810 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  nctions.        
20820 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ** out of the in
20830 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69  ner loop, even i
20840 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61 6e 20  f that means an 
20850 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a  extra OP_Copy. *
20860 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
20870 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20880 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
20890 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Expr, -1);.     
208a0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
208b0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
208c0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
208d0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
208e0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
208f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
20900 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
20910 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20      pFarg = 0;. 
20920 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20930 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70      pFarg = pExp
20940 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
20950 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20    }.      nFarg 
20960 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d  = pFarg ? pFarg-
20970 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
20980 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20990 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
209a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
209b0 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45  ;.      zId = pE
209c0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
209d0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
209e0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
209f0 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20  db, zId, nFarg, 
20a00 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66 20  enc, 0);.#ifdef 
20a10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
20a20 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49  KNOWN_SQL_FUNCTI
20a30 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  ON.      if( pDe
20a40 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  f==0 && pParse->
20a50 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  explain ){.     
20a60 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
20a70 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
20a80 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61  , "unknown", nFa
20a90 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  rg, enc, 0);.   
20aa0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
20ab0 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c    if( pDef==0 ||
20ac0 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65   pDef->xFinalize
20ad0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
20ae0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
20af0 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
20b00 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c  function: %s()",
20b10 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62   zId);.        b
20b20 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
20b30 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
20b40 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65  a direct impleme
20b50 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ntation of the b
20b60 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45  uilt-in COALESCE
20b70 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  () and.      ** 
20b80 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f  IFNULL() functio
20b90 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73  ns.  This avoids
20ba0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61   unnecessary eva
20bb0 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20  luation of.     
20bc0 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61   ** arguments pa
20bd0 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  st the first non
20be0 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a  -NULL argument..
20bf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20c00 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
20c10 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
20c20 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20  _COALESCE ){.   
20c30 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c       int endCoal
20c40 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  esce = sqlite3Vd
20c50 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20c60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20c70 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20  nFarg>=2 );.    
20c80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20c90 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
20ca0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
20cb0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
20cc0 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67  for(i=1; i<nFarg
20cd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20cf0 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
20d00 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f  l, target, endCo
20d10 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
20d20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
20d30 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
20d40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
20d50 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72  move(pParse, tar
20d60 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  get, 1);.       
20d70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
20d80 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
20d90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20da0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
20db0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
20dc0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20dd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20de0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
20df0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rse);.        }.
20e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20e10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
20e20 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  v, endCoalesce);
20e30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20e40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20e50 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29  * The UNLIKELY()
20e60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
20e70 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c  o-op.  The resul
20e80 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20  t is the value. 
20e90 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
20ea0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20  irst argument.. 
20eb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
20ec0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
20ed0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
20ee0 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20  UNLIKELY ){.    
20ef0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
20f00 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=1 );.        
20f10 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
20f20 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
20f30 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
20f40 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
20f50 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  .      }..#ifdef
20f60 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20f70 20 20 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e      /* The AFFIN
20f80 49 54 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65  ITY() function e
20f90 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74  valuates to a st
20fa0 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
20fb0 62 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  bes.      ** the
20fc0 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
20fd0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20  f the argument. 
20fe0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
20ff0 72 20 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20  r testing of.   
21000 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65     ** the SQLite
21010 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20   type logic..   
21020 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21030 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21040 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46  & SQLITE_FUNC_AF
21050 46 49 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20  FINITY ){.      
21060 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
21070 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22  Aff[] = { "blob"
21080 2c 20 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72  , "text", "numer
21090 69 63 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  ic", "integer", 
210a0 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20  "real" };.      
210b0 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20    char aff;.    
210c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
210d0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
210e0 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
210f0 72 41 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d  rAffinity(pFarg-
21100 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
21110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21120 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74  eLoadString(v, t
21130 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20  arget, .        
21140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21150 20 20 20 20 20 20 61 66 66 20 3f 20 61 7a 41 66        aff ? azAf
21160 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46  f[aff-SQLITE_AFF
21170 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29  _BLOB] : "none")
21180 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21190 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
211a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66  .#endif..      f
211b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
211c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
211d0 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
211e0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
211f0 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
21200 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
21210 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31   testcase( i==31
21220 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
21230 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  nstMask |= MASKB
21240 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20  IT32(i);.       
21250 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
21260 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21270 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
21280 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
21290 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
212a0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
212b0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
212c0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
212d0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
212e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
212f0 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
21300 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d        if( constM
21310 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ask ){.         
21320 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d   r1 = pParse->nM
21330 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  em+1;.          
21340 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
21350 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d  nFarg;.        }
21360 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21370 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
21380 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
21390 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20   nFarg);.       
213a0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
213b0 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  or length() and 
213c0 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
213d0 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e  ns with a column
213e0 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20   argument,.     
213f0 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35     ** set the P5
21400 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
21410 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
21420 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e  de to OPFLAG_LEN
21430 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a  GTHARG.        *
21440 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45  * or OPFLAG_TYPE
21450 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65  OFARG respective
21460 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ly, to avoid unn
21470 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20  ecessary data.  
21480 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67        ** loading
21490 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
214a0 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
214b0 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c  funcFlags & (SQL
214c0 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c  ITE_FUNC_LENGTH|
214d0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
214e0 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OF))!=0 ){.     
214f0 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a       u8 exprOp;.
21500 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21510 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
21520 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21530 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
21540 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
21550 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67    exprOp = pFarg
21560 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
21570 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21580 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  exprOp==TK_COLUM
21590 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f  N || exprOp==TK_
215a0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
215b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
215c0 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45  ( SQLITE_FUNC_LE
215d0 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e  NGTH==OPFLAG_LEN
215e0 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
215f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
21600 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
21610 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  ==OPFLAG_TYPEOFA
21620 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
21630 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66    testcase( pDef
21640 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50  ->funcFlags & OP
21650 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
21660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
21670 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
21680 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20  >op2 = .        
21690 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
216a0 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46  funcFlags & (OPF
216b0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50  LAG_LENGTHARG|OP
216c0 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
216d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
216e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
216f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21700 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20  Push(pParse);   
21710 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
21720 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
21730 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21740 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
21750 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30  se, pFarg, r1, 0
21760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
21790 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  P|SQLITE_ECEL_FA
217a0 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 73  CTOR);.        s
217b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
217c0 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  op(pParse);     
217d0 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
217e0 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
217f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21800 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
21810 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21820 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
21830 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
21840 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
21850 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
21860 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
21870 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
21880 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
21890 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
218a0 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
218b0 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
218c0 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
218d0 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
218e0 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
218f0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
21900 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
21910 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
21920 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
21930 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
21940 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
21950 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
21960 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
21970 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
21980 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
21990 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
219a0 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
219b0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
219c0 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
219d0 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
219e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
219f0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
21a00 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
21a10 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
21a20 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
21a30 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
21a40 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
21a50 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
21a60 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
21a70 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
21a80 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
21a90 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
21aa0 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
21ab0 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
21ac0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
21ad0 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26   if( nFarg>=2 &&
21ae0 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
21af0 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
21b00 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
21b10 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
21b20 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
21b30 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
21b40 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
21b50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21b60 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
21b70 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
21b80 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
21b90 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
21ba0 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
21bb0 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
21bc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21bd0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
21be0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
21bf0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
21c00 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
21c10 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
21c20 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
21c30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21c40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
21c50 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
21c60 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
21c70 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
21c80 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
21c90 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
21ca0 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69 66  QL_FUNC.      if
21cb0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
21cc0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
21cd0 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20 20  OFFSET ){.      
21ce0 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70    Expr *pArg = p
21cf0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21d00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
21d10 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  rg->op==TK_COLUM
21d20 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  N ){.          s
21d30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21d40 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70  (v, OP_Offset, p
21d50 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72  Arg->iTable, pAr
21d60 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  g->iColumn, targ
21d70 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
21d80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
21d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21da0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
21db0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
21dc0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
21dd0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
21de0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21df0 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65  AddOp4(v, pParse
21e00 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f  ->iSelfTab ? OP_
21e10 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46  PureFunc0 : OP_F
21e20 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20  unction0,.      
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e40 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72      constMask, r
21e50 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61 72  1, target, (char
21e60 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
21e70 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  EF);.        sql
21e80 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21e90 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
21ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21eb0 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
21ec0 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
21ed0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
21ee0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
21ef0 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
21f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
21f10 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
21f20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
21f30 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
21f40 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
21f50 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
21f60 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  ELECT: {.      i
21f70 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74  nt nCol;.      t
21f80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
21f90 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
21fa0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
21fb0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
21fc0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45   if( op==TK_SELE
21fd0 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45  CT && (nCol = pE
21fe0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
21ff0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d  pEList->nExpr)!=
22000 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
22010 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
22020 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c  or(pParse, nCol,
22030 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
22040 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
22050 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
22060 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
22070 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
22080 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
22090 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
220a0 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
220b0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
220c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
220d0 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d  ->pLeft->iTable=
220e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
220f0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
22100 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  le = sqlite3Code
22110 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
22120 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
22130 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
22140 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
22150 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c  pr->iTable==0 ||
22160 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
22170 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
22180 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
22190 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 26  >iTable.       &
221a0 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  & pExpr->iTable!
221b0 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  =(n = sqlite3Exp
221c0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
221d0 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20 20  r->pLeft)) .    
221e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
221f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22200 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73  rse, "%d columns
22210 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c   assigned %d val
22220 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ues",.          
22230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22240 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
22250 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ble, n);.      }
22260 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
22270 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
22280 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c  le + pExpr->iCol
22290 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  umn;.    }.    c
222a0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
222b0 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
222c0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
222d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
222e0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
222f0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
22300 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
22310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22320 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
22330 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
22340 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22350 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
22360 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
22370 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
22380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22390 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
223a0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
223b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
223c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
223d0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
223e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
223f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
22400 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
22410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22420 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
22430 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
22440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
22450 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
22460 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
22470 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
22480 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
22490 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
224a0 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
224b0 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
224c0 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
224d0 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
224e0 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
224f0 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
22500 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
22510 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
22520 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
22530 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
22540 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
22550 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
22560 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
22570 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
22580 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
22590 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
225a0 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
225b0 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
225c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
225d0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
225e0 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a    case TK_SPAN:.
225f0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
22600 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
22610 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
22620 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
22630 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
22640 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
22650 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
22660 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
22670 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
22680 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
22690 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
226a0 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
226b0 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
226c0 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
226d0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
226e0 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
226f0 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
22700 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
22710 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
22720 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
22730 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
22740 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
22750 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
22760 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
22770 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
22780 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
22790 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
227a0 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
227b0 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
227c0 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
227d0 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
227e0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
227f0 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
22800 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
22810 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
22820 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
22830 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
22840 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
22850 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
22860 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
22870 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
22880 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
22890 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
228a0 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
228b0 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
228c0 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
228d0 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
228e0 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
228f0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
22900 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
22910 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
22920 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
22930 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
22940 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
22950 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
22960 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
22970 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
22980 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
22990 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
229a0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
229b0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
229c0 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
229d0 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
229e0 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
229f0 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
22a00 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
22a10 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
22a20 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
22a30 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
22a40 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
22a50 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
22a60 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
22a70 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
22a80 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
22a90 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22aa0 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
22ab0 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
22ac0 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
22ad0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
22ae0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
22af0 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
22b00 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
22b10 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
22b20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
22b30 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
22b40 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
22b50 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
22b60 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
22b70 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
22b80 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
22b90 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
22ba0 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
22bb0 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
22bc0 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
22bd0 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
22be0 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
22bf0 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
22c00 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
22c10 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
22c20 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
22c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
22c40 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
22c50 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
22c60 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
22c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22c80 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
22c90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
22ca0 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
22cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
22cc0 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
22cd0 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
22ce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22cf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
22d00 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
22d10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22d20 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
22d30 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
22d40 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
22d50 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
22d60 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
22d70 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
22d80 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
22d90 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
22da0 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
22db0 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
22dc0 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
22dd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
22de0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
22df0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
22e00 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
22e10 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
22e20 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
22e30 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
22e40 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
22e50 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
22e60 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
22e70 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
22e80 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
22e90 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
22ea0 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
22eb0 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
22ec0 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
22ed0 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
22ee0 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
22ef0 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
22f00 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
22f10 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
22f20 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
22f30 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
22f40 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
22f50 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
22f60 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
22f70 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
22f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
22f90 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
22fa0 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
22fb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22fd0 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
22fe0 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
22ff0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
23000 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
23010 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
23020 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
23030 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c   case TK_IF_NULL
23040 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ROW: {.      in
23050 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20 20  t addrINR;.     
23060 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69 74   addrINR = sqlit
23070 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
23080 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70 45  OP_IfNullRow, pE
23090 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
230a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
230b0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
230c0 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
230d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
230e0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
230f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
23100 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
23110 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
23120 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
23130 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
23140 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20  e(v, addrINR);. 
23150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23160 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
23170 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  INR, inReg);.   
23180 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23190 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
231a0 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
231b0 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
231c0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
231d0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
231e0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
231f0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
23200 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
23210 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
23220 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
23230 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
23240 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
23250 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
23260 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
23270 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
23280 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
23290 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
232a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
232b0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
232c0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
232d0 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
232e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
232f0 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
23300 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
23310 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
23320 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
23330 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
23340 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68     ** Y is in th
23350 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
23360 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
23370 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   if pExpr->x.pLi
23380 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20  st->nExpr is.   
23390 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20   ** odd.  The Y 
233a0 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
233b0 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  .  If the number
233c0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
233d0 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69  x.pList.    ** i
233e0 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69  s even, then Y i
233f0 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  s omitted and th
23400 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65  e "otherwise" re
23410 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sult is NULL..  
23420 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
23430 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
23440 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
23450 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
23460 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
23470 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
23480 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
23490 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
234a0 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
234b0 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
234c0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
234d0 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
234e0 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
234f0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
23500 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
23510 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
23520 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
23530 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
23540 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
23550 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
23560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
23570 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
23580 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
23590 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
235a0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
235b0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
235c0 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
235d0 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
235e0 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
23610 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
23620 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
23630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23650 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
23660 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
23670 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
23680 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
23690 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
236a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
236b0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
236c0 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
236d0 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
236e0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
236f0 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
23700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23710 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
23720 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
23730 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23750 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
23760 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
23770 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23790 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
237a0 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
237b0 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f  B) */.      VVA_
237c0 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65  ONLY( int iCache
237d0 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
237e0 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a  iCacheLevel; )..
237f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23800 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23810 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
23820 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
23830 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
23840 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
23850 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
23860 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
23870 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
23880 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
23890 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
238a0 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
238b0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
238c0 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
238d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
238e0 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  (v);.      if( (
238f0 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
23900 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
23910 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20   tempX = *pX;.  
23920 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23930 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
23940 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  N );.        exp
23950 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d  rToRegister(&tem
23960 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74  pX, exprCodeVect
23970 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  or(pParse, &temp
23980 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
23990 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
239a0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
239b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
239c0 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73  &opCompare, 0, s
239d0 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29  izeof(opCompare)
239e0 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  );.        opCom
239f0 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b  pare.op = TK_EQ;
23a00 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
23a10 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70  re.pLeft = &temp
23a20 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74  X;.        pTest
23a30 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20   = &opCompare;. 
23a40 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74         /* Ticket
23a50 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31   b351d95f9cd5ef1
23a60 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38  7e9d9dbae18f5ca8
23a70 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20  611190001:.     
23a80 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20     ** The value 
23a90 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68  in regFree1 migh
23aa0 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69  t get SCopy-ed i
23ab0 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73  nto the file res
23ac0 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ult..        ** 
23ad0 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  So make sure tha
23ae0 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72  t the regFree1 r
23af0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72  egister is not r
23b00 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a  eused for other.
23b10 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f          ** purpo
23b20 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ses and possibly
23b30 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
23b40 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65  /.        regFre
23b50 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  e1 = 0;.      }.
23b60 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
23b70 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29  <nExpr-1; i=i+2)
23b80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23b90 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
23ba0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
23bb0 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20  if( pX ){.      
23bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73      assert( pTes
23bd0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
23be0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67    opCompare.pRig
23bf0 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ht = aListelem[i
23c00 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
23c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23c20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65    pTest = aListe
23c30 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
23c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23c50 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74  nextCase = sqlit
23c60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
23c70 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
23c80 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d  case( pTest->op=
23c90 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
23ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23cb0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
23cc0 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65   pTest, nextCase
23cd0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
23ce0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ULL);.        te
23cf0 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
23d00 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
23d10 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
23d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23d30 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
23d40 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
23d50 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
23d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23d70 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65  eGoto(v, endLabe
23d80 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
23d90 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
23da0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
23db0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
23dc0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74  lveLabel(v, next
23dd0 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Case);.      }. 
23de0 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26       if( (nExpr&
23df0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)!=0 ){.       
23e00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
23e10 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
23e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23e30 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
23e40 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31  EList->a[nExpr-1
23e50 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
23e60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23e70 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
23e80 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  arse);.      }el
23e90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
23ea0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23eb0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
23ec0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
23ed0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
23ee0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
23ef0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
23f00 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20  nErr>0 .        
23f10 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43     || pParse->iC
23f20 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68  acheLevel==iCach
23f30 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20  eLevel );.      
23f40 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
23f50 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
23f60 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
23f70 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
23f80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
23f90 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
23fa0 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
23fb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
23fc0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c  ffinity==OE_Roll
23fd0 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20  back .          
23fe0 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
23ff0 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20  ity==OE_Abort.  
24000 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
24010 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
24020 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Fail.           
24030 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
24040 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20  ty==OE_Ignore.  
24050 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
24060 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
24070 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  erTab ){.       
24080 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
24090 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c  "RAISE() may onl
240c0 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  y be used within
240d0 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72   a trigger-progr
240e0 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  am");.        re
240f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
24100 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
24110 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
24120 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
24130 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
24140 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
24150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
24160 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24170 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
24180 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
24190 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
241a0 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
241b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
241c0 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
241d0 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c       v, OP_Halt,
241e0 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49   SQLITE_OK, OE_I
241f0 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d  gnore, 0, pExpr-
24200 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20  >u.zToken,0);.  
24210 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
24220 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
24230 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
24240 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
24250 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
24260 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
24270 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24290 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
242a0 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ty, pExpr->u.zTo
242b0 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ken, 0, 0);.    
242c0 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
242d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
242e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
242f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
24300 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
24310 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24320 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
24330 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
24340 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
24350 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65  * Factor out the
24360 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76   code of the giv
24370 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
24380 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
24390 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  time..**.** If r
243a0 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74  egDest>=0 then t
243b0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
243c0 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ays stored in th
243d0 61 74 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  at register and 
243e0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  the.** result is
243f0 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20   not reusable.  
24400 49 66 20 72 65 67 44 65 73 74 3c 30 20 74 68 65  If regDest<0 the
24410 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
24420 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74  s free to .** st
24430 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 77 68  ore the value wh
24440 65 72 65 65 76 65 72 20 69 74 20 77 61 6e 74 73  ereever it wants
24450 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20  .  The register 
24460 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73  where the expres
24470 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72  sion .** is stor
24480 65 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ed is returned. 
24490 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c   When regDest<0,
244a0 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65   two identical e
244b0 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a  xpressions will.
244c0 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73  ** code to the s
244d0 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  ame register..*/
244e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
244f0 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61  CodeAtInit(.  Pa
24500 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
24510 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
24520 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
24530 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
24540 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63   expression to c
24550 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42  ode when the VDB
24560 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f  E initializes */
24570 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 20 20  .  int regDest  
24580 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
24590 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  e value in this 
245a0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
245b0 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20   ExprList *p;.  
245c0 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63  assert( ConstFac
245d0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b  torOk(pParse) );
245e0 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
245f0 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28  ConstExpr;.  if(
24600 20 72 65 67 44 65 73 74 3c 30 20 26 26 20 70 20   regDest<0 && p 
24610 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
24620 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
24630 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  em;.    int i;. 
24640 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e     for(pItem=p->
24650 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69  a, i=p->nExpr; i
24660 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d  >0; pItem++, i--
24670 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
24680 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20  em->reusable && 
24690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
246a0 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70  re(0,pItem->pExp
246b0 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29  r,pExpr,-1)==0 )
246c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
246d0 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
246e0 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d  ExprReg;.      }
246f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78  .    }.  }.  pEx
24700 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
24710 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
24720 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d  pExpr, 0);.  p =
24730 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
24740 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
24750 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
24760 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74  p ){.     struct
24770 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
24780 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
24790 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
247a0 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
247b0 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20  = regDest<0;.   
247c0 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20    if( regDest<0 
247d0 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50  ) regDest = ++pP
247e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
247f0 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
24800 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73  ExprReg = regDes
24810 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  t;.  }.  pParse-
24820 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b  >pConstExpr = p;
24830 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44 65 73  .  return regDes
24840 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
24850 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
24860 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
24870 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
24880 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
24890 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
248a0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
248b0 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
248c0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
248d0 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
248e0 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
248f0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
24900 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
24910 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
24920 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
24930 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
24940 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
24950 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
24960 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
24970 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
24980 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pReg to zero..**
24990 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
249a0 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  a constant, then
249b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
249c0 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69  ght generate thi
249d0 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c  s.** code to fil
249e0 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  l the register i
249f0 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
24a00 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20  tion section of 
24a10 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67  the.** VDBE prog
24a20 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ram, in order to
24a30 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f   factor it out o
24a40 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  f the evaluation
24a50 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
24a60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
24a70 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
24a80 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
24a90 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
24aa0 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r2;.  pExpr = sq
24ab0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
24ac0 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
24ad0 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
24ae0 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70  (pParse).   && p
24af0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
24b00 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69  ISTER.   && sqli
24b10 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24b20 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a  tNotJoin(pExpr).
24b30 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20    ){.    *pReg  
24b40 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  = 0;.    r2 = sq
24b50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
24b60 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
24b70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  r, -1);.  }else{
24b80 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
24b90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
24ba0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
24bb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24bc0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
24bd0 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
24be0 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
24bf0 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
24c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24c10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
24c20 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
24c30 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20  1);.      *pReg 
24c40 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
24c50 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
24c60 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24c70 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
24c80 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
24c90 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
24ca0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
24cb0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24cc0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
24cd0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
24ce0 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
24cf0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24d00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24d10 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
24d20 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24d30 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24d40 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
24d50 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
24d60 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
24d70 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
24d80 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
24d90 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
24da0 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
24db0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
24dc0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
24dd0 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
24de0 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
24df0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
24e00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24e10 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
24e20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
24e30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
24e40 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20  se->pVdbe!=0 || 
24e50 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
24e60 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
24e70 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
24e80 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
24e90 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
24ea0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
24eb0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
24ec0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
24ed0 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
24ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
24ef0 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20   transient copy 
24f00 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
24f10 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64  xpr and then cod
24f20 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
24f30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e  lite3ExprCode().
24f40 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
24f50 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73  orks just like s
24f60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
24f70 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  .** except that 
24f80 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73  the input expres
24f90 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65  sion is guarante
24fa0 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67  ed to be unchang
24fb0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
24fc0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
24fd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24fe0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24ff0 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74  target){.  sqlit
25000 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
25010 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  >db;.  pExpr = s
25020 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
25030 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
25040 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
25050 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78  iled ) sqlite3Ex
25060 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
25070 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
25080 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
25090 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
250a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
250b0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
250c0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
250d0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
250e0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
250f0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
25100 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
25110 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
25120 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
25130 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
25140 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
25150 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
25160 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
25170 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
25180 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
25190 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
251a0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
251b0 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
251c0 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
251d0 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
251e0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
251f0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
25200 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
25210 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
25220 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
25230 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
25240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
25250 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
25260 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
25270 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
25280 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
25290 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
252a0 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
252b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
252c0 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
252d0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
252e0 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
252f0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
25300 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
25310 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
25320 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
25330 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
25340 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
25350 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
25360 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
25370 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
25380 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
25390 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
253a0 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
253b0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
253c0 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
253d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
253e0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
253f0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
25400 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
25410 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
25420 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
25430 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
25440 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
25450 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
25460 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64   reused..*/.void
25470 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25480 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
25490 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
254a0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
254b0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
254c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
254d0 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  nt iMem;..  asse
254e0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
254f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25500 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
25510 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
25520 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
25530 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
25540 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
25550 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
25560 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
25570 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69  _Copy, target, i
25580 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65  Mem);.  exprToRe
25590 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d  gister(pExpr, iM
255a0 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  em);.}../*.** Ge
255b0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
255c0 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
255d0 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
255e0 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
255f0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
25600 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
25610 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
25620 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
25630 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
25640 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
25650 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
25660 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  ed.  The number 
25670 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a  returned will.**
25680 20 75 73 75 61 6c 6c 79 20 62 65 20 70 4c 69 73   usually be pLis
25690 74 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d 69 67  t->nExpr but mig
256a0 68 74 20 62 65 20 72 65 64 75 63 65 64 20 69 66  ht be reduced if
256b0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
256c0 54 52 45 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e  TREF.** is defin
256d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ed..**.** The SQ
256e0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c  LITE_ECEL_DUP fl
256f0 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  ag prevents the 
25700 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62  arguments from b
25710 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75  eing.** filled u
25720 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20  sing OP_SCopy.  
25730 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20  OP_Copy must be 
25740 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
25750 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
25760 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d  CEL_FACTOR argum
25770 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74  ent allows const
25780 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ant arguments to
25790 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20   be.** factored 
257a0 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c  out into initial
257b0 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a  ization code..**
257c0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
257d0 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61  CEL_REF flag mea
257e0 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69  ns that expressi
257f0 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ons in the list 
25800 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74  with.** ExprList
25810 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  .a[].u.x.iOrderB
25820 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65  yCol>0 have alre
25830 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74  ady been evaluat
25840 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
25850 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74   in registers at
25860 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20   srcReg, and so 
25870 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65  the value can be
25880 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
25890 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  re..** If SQLITE
258a0 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73  _ECEL_OMITREF is
258b0 20 61 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e 20   also set, then 
258c0 74 68 65 20 76 61 6c 75 65 73 20 77 69 74 68 20  the values with 
258d0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
258e0 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79 20  0.** are simply 
258f0 6f 6d 69 74 74 65 64 20 72 61 74 68 65 72 20 74  omitted rather t
25900 68 61 6e 20 62 65 69 6e 67 20 63 6f 70 69 65 64  han being copied
25910 20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f   from srcReg..*/
25920 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
25930 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
25940 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
25950 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
25960 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
25970 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
25980 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
25990 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
259a0 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
259b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
259c0 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
259d0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
259e0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
259f0 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
25a00 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
25a10 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
25a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
25a30 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
25a40 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
25a50 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
25a60 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
25a70 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
25a80 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
25a90 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
25aa0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
25ab0 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
25ac0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
25ad0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
25ae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
25af0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
25b00 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
25b10 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
25b20 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
25b30 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
25b40 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
25b50 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
25b60 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
25b70 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
25b80 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
25b90 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
25ba0 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
25bb0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
25bc0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
25bd0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66  Item->pExpr;.#if
25be0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
25bf0 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
25c00 43 45 53 0a 20 20 20 20 69 66 28 20 70 49 74 65  CES.    if( pIte
25c10 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 29 7b  m->bSorterRef ){
25c20 0a 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20  .      i--;.    
25c30 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65    n--;.    }else
25c40 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
25c50 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25c60 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20  ECEL_REF)!=0 && 
25c70 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  (j = pItem->u.x.
25c80 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
25c90 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  {.      if( flag
25ca0 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25cb0 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20  OMITREF ){.     
25cc0 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20     i--;.        
25cd0 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n--;.      }else
25ce0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25cf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
25d00 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d  opyOp, j+srcReg-
25d10 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  1, target+i);.  
25d20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
25d30 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
25d40 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
25d50 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  !=0 && sqlite3Ex
25d60 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78  prIsConstant(pEx
25d70 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
25d80 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
25d90 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
25da0 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
25db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
25dc0 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65  t inReg = sqlite
25dd0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
25de0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
25df0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
25e00 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
25e10 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56  t+i ){.        V
25e20 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
25e30 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d      if( copyOp==
25e40 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20  OP_Copy.        
25e50 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33   && (pOp=sqlite3
25e60 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29  VdbeGetOp(v, -1)
25e70 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  )->opcode==OP_Co
25e80 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  py.         && p
25e90 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p1+pOp->p3+1
25ea0 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ==inReg.        
25eb0 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d   && pOp->p2+pOp-
25ec0 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a  >p3+1==target+i.
25ed0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
25ee0 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a       pOp->p3++;.
25ef0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25f00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25f10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f  VdbeAddOp2(v, co
25f20 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72  pyOp, inReg, tar
25f30 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  get+i);.        
25f40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
25f50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
25f60 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
25f70 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54  e code for a BET
25f80 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  WEEN operator..*
25f90 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45  *.**    x BETWEE
25fa0 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20  N y AND z.**.** 
25fb0 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75  The above is equ
25fc0 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a  ivalent to .**.*
25fd0 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
25fe0 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74  =z.**.** Code it
25ff0 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
26000 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
26010 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
26020 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74  sion.** eliminat
26030 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20  ion of x..**.** 
26040 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61 72 61  The xJumpIf para
26050 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
26060 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20   details:.**.** 
26070 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20     NULL:        
26080 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65             Store
26090 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
260a0 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73 74 5d  ult in reg[dest]
260b0 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78  .**    sqlite3Ex
260c0 70 72 49 66 54 72 75 65 3a 20 20 20 20 20 20 4a  prIfTrue:      J
260d0 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 74  ump to dest if t
260e0 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  rue.**    sqlite
260f0 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20 20 20  3ExprIfFalse:   
26100 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69    Jump to dest i
26110 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68  f false.**.** Th
26120 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72  e jumpIfNull par
26130 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
26140 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69 73 20  d if xJumpIf is 
26150 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
26160 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
26170 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
26180 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
26190 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
261a0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
261b0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
261c0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
261d0 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
261e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
261f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
26200 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20   destination or 
26210 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e  storage location
26220 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75   */.  void (*xJu
26230 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a  mp)(Parse*,Expr*
26240 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63  ,int,int), /* Ac
26250 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a  tion to take */.
26260 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c    int jumpIfNull
26270 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20      /* Take the 
26280 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57  jump if the BETW
26290 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  EEN is NULL */.)
262a0 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b  {. Expr exprAnd;
262b0 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20       /* The AND 
262c0 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d  operator in  x>=
262d0 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20  y AND x<=z  */. 
262e0 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20   Expr compLeft; 
262f0 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20     /* The  x>=y 
26300 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
26310 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20  compRight;   /* 
26320 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20  The  x<=z  term 
26330 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b  */.  Expr exprX;
26340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78         /* The  x
26350 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20    subexpression 
26360 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
26370 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72  1 = 0; /* Tempor
26380 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
26390 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 26   */...  memset(&
263a0 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a  compLeft, 0, siz
263b0 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
263c0 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74 2c  mset(&compRight,
263d0 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
263e0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78 70  );.  memset(&exp
263f0 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rAnd, 0, sizeof(
26400 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65 72  Expr));..  asser
26410 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
26420 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
26430 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78  sSelect) );.  ex
26440 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c  prX = *pExpr->pL
26450 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f  eft;.  exprAnd.o
26460 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78  p = TK_AND;.  ex
26470 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
26480 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ompLeft;.  exprA
26490 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
264a0 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65  pRight;.  compLe
264b0 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20  ft.op = TK_GE;. 
264c0 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
264d0 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
264e0 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
264f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
26500 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70  0].pExpr;.  comp
26510 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
26520 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c  ;.  compRight.pL
26530 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
26540 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
26550 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
26560 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
26570 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
26580 26 65 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65  &exprX, exprCode
26590 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26  Vector(pParse, &
265a0 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
265b0 29 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20  ));.  if( xJump 
265c0 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61  ){.    xJump(pPa
265d0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
265e0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
265f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26600 2a 20 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65  * Mark the expre
26610 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66  ssion is being f
26620 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
26630 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
26640 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74  join.    ** so t
26650 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 45  hat the sqlite3E
26660 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 29 20  xprCodeTarget() 
26670 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
26680 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65   attempt to move
26690 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
266a0 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74  the Parse.pConst
266b0 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73  Expr list.  We s
266c0 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20  hould use a new 
266d0 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20  bit for this,.  
266e0 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79    ** for clarity
266f0 2c 20 62 75 74 20 77 65 20 61 72 65 20 6f 75 74  , but we are out
26700 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
26710 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
26720 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61   so we.    ** ha
26730 76 65 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  ve to reuse the 
26740 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e  EP_FromJoin bit.
26750 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20    Bummer. */.   
26760 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20   exprX.flags |= 
26770 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20  EP_FromJoin;.   
26780 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26790 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 26  Target(pParse, &
267a0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a  exprAnd, dest);.
267b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
267c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
267d0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a  se, regFree1);..
267e0 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71    /* Ensure adeq
267f0 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61  uate test covera
26800 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ge */.  testcase
26810 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
26820 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
26830 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
26840 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26850 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26860 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
26870 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
26880 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
26890 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
268a0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
268b0 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
268c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
268d0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
268e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
268f0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26900 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26910 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
26920 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
26930 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26940 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
26950 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26960 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
26970 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26980 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26990 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
269a0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
269b0 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
269c0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
269d0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
269e0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
269f0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
26a00 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26a10 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26a20 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26a30 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
26a40 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
26a50 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26a60 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
26a70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
26a80 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
26a90 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
26aa0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
26ab0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
26ac0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
26ad0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
26ae0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
26af0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
26b00 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
26b10 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
26b20 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
26b30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
26b40 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
26b50 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
26b60 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
26b70 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
26b80 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
26b90 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
26ba0 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
26bb0 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
26bc0 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
26bd0 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
26be0 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
26bf0 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
26c00 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
26c10 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
26c20 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
26c30 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
26c40 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
26c50 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
26c60 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
26c70 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
26c80 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
26c90 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
26ca0 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
26cb0 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
26cc0 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
26cd0 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
26ce0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
26cf0 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
26d00 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
26d10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
26d20 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
26d30 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
26d40 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
26d50 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
26d60 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
26d70 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
26d80 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
26d90 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
26da0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
26db0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
26dc0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
26dd0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
26de0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
26df0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
26e00 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
26e10 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
26e20 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
26e30 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
26e40 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
26e50 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
26e60 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
26e70 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
26e80 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
26e90 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
26ea0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
26eb0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
26ec0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
26ed0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
26ee0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26ef0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26f00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26f10 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
26f20 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
26f30 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53   d2,jumpIfNull^S
26f40 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26f60 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
26f70 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
26f80 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
26f90 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
26fa0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
26fb0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
26fc0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
26fd0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
26fe0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26ff0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
27000 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27010 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27020 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _OR: {.      tes
27030 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27040 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
27050 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27060 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27070 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
27080 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
27090 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
270a0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
270b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
270c0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
270d0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
270e0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
270f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27100 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
27110 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27120 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27130 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
27140 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27150 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
27160 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
27170 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27180 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
27190 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
271a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
271b0 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
271c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e   {.      int isN
271d0 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20 4e  ot;      /* IS N
271e0 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f  OT TRUE or IS NO
271f0 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20  T FALSE */.     
27200 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20   int isTrue;    
27210 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49   /* IS TRUE or I
27220 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20  S NOT TRUE */.  
27230 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27240 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27250 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78       isNot = pEx
27260 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f  pr->op2==TK_ISNO
27270 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  T;.      isTrue 
27280 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
27290 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
272a0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65  Right);.      te
272b0 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
272c0 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20  & isNot );.     
272d0 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
272e0 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
272f0 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20       if( isTrue 
27300 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20  ^ isNot ){.     
27310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27320 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
27330 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
27340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27350 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
27360 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
27370 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
27380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27390 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
273a0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
273b0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
273c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273d0 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
273e0 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ? SQLITE_JUMPIFN
273f0 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ULL : 0);.      
27400 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
27410 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27420 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
27430 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
27440 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
27450 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
27460 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
27470 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
27480 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
27490 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
274a0 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
274b0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
274c0 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
274d0 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
274e0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
274f0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
27500 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
27510 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
27520 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
27530 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
27540 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
27550 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
27560 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
27570 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
27580 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27590 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
275a0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
275b0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
275c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
275d0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
275e0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
275f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27600 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
27610 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
27620 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
27630 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27640 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
27650 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
27660 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
27670 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
27680 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
27690 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
276a0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
276b0 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
276c0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
276d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
276e0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
276f0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
27700 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
27710 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
27720 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27730 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
27740 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
27750 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27760 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
27770 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
27780 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
27790 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
277a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
277b0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
277c0 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
277d0 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
277e0 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
277f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27800 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
27810 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
27820 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
27830 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27840 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27850 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
27860 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
27870 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
27880 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
27890 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
278a0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
278b0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
278c0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
278d0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
278e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
278f0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27900 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
27910 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
27920 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27930 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
27940 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27950 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
27960 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27970 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
27980 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
27990 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
279a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
279b0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
279c0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
279d0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
279e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
279f0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
27a00 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
27a10 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
27a20 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
27a30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27a40 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27a50 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
27a60 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
27a70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27a80 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
27a90 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27aa0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
27ab0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
27ac0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27ad0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
27ae0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27af0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
27b00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27b10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
27b20 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
27b30 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27b40 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27b50 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
27b60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
27b70 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
27b80 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
27b90 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
27ba0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
27bb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
27bc0 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
27bd0 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
27be0 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
27bf0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
27c00 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
27c10 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
27c20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
27c30 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
27c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27c50 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
27c60 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
27c70 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
27c80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27c90 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
27ca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27cb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27cc0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
27cd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27ce0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
27cf0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
27d00 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20  fault_expr:.    
27d10 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
27d20 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
27d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27d40 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
27d50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27d60 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
27d70 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
27d80 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20     /* No-op */. 
27d90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27da0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
27db0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
27dc0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
27dd0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
27de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27df0 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
27e00 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27e10 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
27e20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
27e30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27e40 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
27e50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27e60 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27e70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27e80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27e90 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
27ea0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
27eb0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
27ec0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27ed0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
27ee0 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
27ef0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
27f00 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
27f10 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
27f20 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
27f30 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
27f40 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
27f50 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
27f60 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
27f70 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
27f80 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
27f90 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27fa0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
27fb0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27fc0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
27fd0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
27fe0 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
27ff0 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
28000 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
28010 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
28020 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
28030 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
28040 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
28050 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
28060 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
28070 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
28080 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
28090 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
280a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
280b0 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
280c0 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
280d0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
280e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
280f0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
28100 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
28110 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
28120 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28130 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
28140 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
28150 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
28160 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
28170 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
28180 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
28190 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
281a0 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
281b0 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
281c0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
281d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
281e0 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
281f0 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
28200 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
28210 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
28220 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
28230 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
28240 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
28250 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
28260 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
28270 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
28280 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
28290 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
282a0 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
282b0 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
282c0 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
282d0 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
282e0 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
282f0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
28300 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
28310 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
28320 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
28330 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
28340 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
28350 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
28360 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
28370 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
28380 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
28390 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
283a0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
283b0 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
283c0 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
283d0 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
283e0 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
283f0 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
28400 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
28410 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
28420 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
28430 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
28440 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
28450 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
28460 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
28470 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
28480 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
28490 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
284a0 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
284b0 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
284c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
284d0 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
284e0 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
284f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
28500 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
28510 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
28520 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
28530 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
28540 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
28550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28560 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
28570 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
28580 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28590 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
285a0 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
285b0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
285c0 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
285d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
285e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
285f0 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
28600 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28610 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
28620 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
28630 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
28640 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
28650 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
28660 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28670 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
28680 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28690 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
286a0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
286b0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
286c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
286d0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
286e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
286f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
28700 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
28710 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
28720 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28730 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
28740 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28750 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28760 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
28770 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
28780 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
28790 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
287a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
287b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
287c0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
287d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
287e0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
287f0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
28800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28810 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
28820 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
28830 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28840 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
28850 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
28860 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
28870 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
28880 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
28890 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
288a0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
288b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
288c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
288d0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
288e0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
288f0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
28900 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
28910 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28920 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
28930 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
28940 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
28950 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b  case TK_TRUTH: {
28960 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74  .      int isNot
28970 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52  ;   /* IS NOT TR
28980 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c  UE or IS NOT FAL
28990 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  SE */.      int 
289a0 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20 54  isTrue;  /* IS T
289b0 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52  RUE or IS NOT TR
289c0 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  UE */.      test
289d0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
289e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e  ==0 );.      isN
289f0 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  ot = pExpr->op2=
28a00 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20  =TK_ISNOT;.     
28a10 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65   isTrue = sqlite
28a20 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
28a30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
28a40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28a50 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
28a60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28a70 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69 73  e( !isTrue && is
28a80 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Not );.      if(
28a90 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20   isTrue ^ isNot 
28aa0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53  ){.        /* IS
28ab0 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f 54   TRUE and IS NOT
28ac0 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
28ad0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28ae0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
28af0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
28b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28b10 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
28b20 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a  t ? 0 : SQLITE_J
28b30 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20  UMPIFNULL);..   
28b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28b50 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61 6e    /* IS FALSE an
28b60 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  d IS NOT TRUE */
28b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28b80 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
28b90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28ba0 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c   isNot ? 0 : SQL
28bd0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
28be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
28bf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
28c00 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
28c10 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
28c20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28c30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
28c40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28c50 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
28c60 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
28c70 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
28c80 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
28c90 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a  : TK_EQ;.      j
28ca0 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
28cb0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
28cc0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
28cd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
28ce0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
28cf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
28d00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
28d10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
28d20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
28d30 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
28d40 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
28d50 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
28d60 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
28d70 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
28d80 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28d90 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
28da0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
28db0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
28dc0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
28dd0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
28de0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28df0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28e00 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
28e10 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
28e20 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
28e30 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28e40 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
28e50 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
28e60 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
28e70 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28e80 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
28e90 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
28ea0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
28eb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28ec0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
28ed0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
28ee0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
28ef0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
28f00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28f10 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
28f20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
28f30 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
28f40 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
28f50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
28f60 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
28f70 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
28f80 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
28f90 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
28fa0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
28fb0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
28fc0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
28fd0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
28fe0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
28ff0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
29000 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
29010 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
29020 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
29030 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
29040 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
29050 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
29060 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
29070 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
29080 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
29090 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
290a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
290b0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
290c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
290d0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
290e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
290f0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
29100 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
29110 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
29120 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
29130 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
29140 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
29150 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
29160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
29170 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
29180 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
29190 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
291a0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
291b0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
291c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
291d0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
291e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
291f0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
29200 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
29210 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
29220 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65  LL );   VdbeCove
29230 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
29240 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
29250 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
29260 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62  _NOTNULL );  Vdb
29270 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
29280 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
29290 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
292a0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
292b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
292c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
292d0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
292e0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
292f0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
29300 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
29310 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
29320 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
29330 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e  IfFalse, jumpIfN
29340 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
29350 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
29360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
29370 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
29380 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
29390 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
293a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
293b0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
293c0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
293d0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
293e0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
293f0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
29400 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29410 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
29420 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
29430 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
29440 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
29450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29460 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
29470 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
29480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
29490 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
294a0 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
294b0 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
294c0 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65  pr: .      if( e
294d0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
294e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
294f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
29500 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
29510 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
29520 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
29530 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
29540 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
29550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
29560 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
29570 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
29580 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
29590 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
295a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
295b0 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
295c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
295d0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
295e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
295f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
29600 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
29610 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
29620 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
29630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
29640 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
29650 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
29660 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
29670 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
29680 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
29690 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
296a0 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b  2);.}../*.** Lik
296b0 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
296c0 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68  alse() except th
296d0 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64  at a copy is mad
296e0 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72  e of pExpr befor
296f0 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61  e.** code genera
29700 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63  tion, and that c
29710 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61  opy is deleted a
29720 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61  fter code genera
29730 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e  tion. This.** en
29740 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f  sures that the o
29750 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73  riginal pExpr is
29760 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
29770 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
29780 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20  fFalseDup(Parse 
29790 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
297a0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69  Expr, int dest,i
297b0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
297c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
297d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
297e0 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  pr *pCopy = sqli
297f0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
29800 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
29810 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29820 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
29830 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
29840 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73  arse, pCopy, des
29850 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
29860 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
29870 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70  rDelete(db, pCop
29880 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  y);.}../*.** Exp
29890 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20  ression pVar is 
298a0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
298b0 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65   an SQL variable
298c0 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65 20 61  . pExpr may be a
298d0 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78  ny.** type of ex
298e0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
298f0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69  If pExpr is a si
29900 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d  mple SQL value -
29910 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61   an integer, rea
29920 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a  l, string, blob.
29930 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65  ** or NULL value
29940 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42 45   - then the VDBE
29950 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
29960 20 70 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e   prepared is con
29970 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65  figured.** to re
29980 2d 70 72 65 70 61 72 65 20 65 61 63 68 20 74 69  -prepare each ti
29990 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69  me a new value i
299a0 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61  s bound to varia
299b0 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20  ble pVar..**.** 
299c0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66  Additionally, if
299d0 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70   pExpr is a simp
299e0 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64  le SQL value and
299f0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 68   the value is th
29a00 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61  e.** same as tha
29a10 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e  t currently boun
29a20 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56  d to variable pV
29a30 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  ar, non-zero is 
29a40 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
29a50 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 76  erwise, if the v
29a60 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68  alues are not th
29a70 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78  e same or if pEx
29a80 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  pr is not a simp
29a90 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c  le.** SQL value,
29aa0 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
29ab0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29ac0 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69   exprCompareVari
29ad0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
29ae0 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20  se, Expr *pVar, 
29af0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
29b00 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69  int res = 0;.  i
29b10 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74  nt iVar;.  sqlit
29b20 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70  e3_value *pL, *p
29b30 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69  R = 0;.  .  sqli
29b40 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
29b50 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
29b60 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  pr, SQLITE_UTF8,
29b70 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
29b80 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52  , &pR);.  if( pR
29b90 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70   ){.    iVar = p
29ba0 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  Var->iColumn;.  
29bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
29bc0 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
29bd0 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20  pVdbe, iVar);.  
29be0 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64    pL = sqlite3Vd
29bf0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
29c00 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
29c10 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45  re, iVar, SQLITE
29c20 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20  _AFF_BLOB);.    
29c30 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20  if( pL ){.      
29c40 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
29c50 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49  e_type(pL)==SQLI
29c60 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
29c70 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
29c80 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61  _text(pL); /* Ma
29c90 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f  ke sure the enco
29ca0 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f  ding is UTF-8 */
29cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
29cc0 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33  es =  0==sqlite3
29cd0 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70  MemCompare(pL, p
29ce0 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  R, 0);.    }.   
29cf0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
29d00 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(pR);.    sqlit
29d10 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b  e3ValueFree(pL);
29d20 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
29d30 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  es;.}../*.** Do 
29d40 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
29d50 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
29d60 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
29d70 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
29d80 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
29d90 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
29da0 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
29db0 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
29dc0 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
29dd0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
29de0 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
29df0 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
29e00 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
29e10 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
29e20 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
29e30 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
29e40 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
29e50 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
29e60 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
29e70 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
29e80 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
29e90 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
29ea0 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
29eb0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
29ec0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
29ed0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
29ee0 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
29ef0 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
29f00 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
29f10 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
29f20 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
29f30 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
29f40 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
29f50 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
29f60 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
29f70 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
29f80 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
29f90 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
29fa0 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
29fb0 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
29fc0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
29fd0 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
29fe0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
29ff0 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
2a000 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
2a010 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
2a020 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
2a030 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
2a040 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
2a050 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
2a060 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
2a070 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
2a080 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
2a090 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
2a0a0 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
2a0b0 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
2a0c0 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
2a0d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
2a0e0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
2a0f0 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
2a100 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
2a110 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
2a120 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
2a130 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
2a140 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
2a150 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
2a160 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
2a170 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
2a180 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
2a190 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
2a1a0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
2a1b0 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  malfunction..**.
2a1c0 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
2a1d0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b  not NULL then TK
2a1e0 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20  _VARIABLE terms 
2a1f0 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64 69  in pA with bindi
2a200 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  ngs in.** pParse
2a210 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63 61 6e  ->pReprepare can
2a220 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61 69   be matched agai
2a230 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20  nst literals in 
2a240 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61  pB.  The .** pPa
2a250 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d  rse->pVdbe->expm
2a260 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75  ask bitmask is u
2a270 70 64 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  pdated for each 
2a280 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e  variable referen
2a290 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73  ced..** If pPars
2a2a0 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e  e is NULL (the n
2a2b0 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e  ormal case) then
2a2c0 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45   any TK_VARIABLE
2a2d0 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67   term in .** Arg
2a2e0 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f  ument pParse sho
2a2f0 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
2a300 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e  NULL. If it is n
2a310 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f  ot NULL and pA o
2a320 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61  r.** pB causes a
2a330 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
2a340 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   2..*/.int sqlit
2a350 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61  e3ExprCompare(Pa
2a360 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2a370 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
2a380 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33   int iTab){.  u3
2a390 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b  2 combinedFlags;
2a3a0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
2a3b0 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
2a3c0 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
2a3d0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   2;.  }.  if( pP
2a3e0 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d  arse && pA->op==
2a3f0 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65  TK_VARIABLE && e
2a400 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62  xprCompareVariab
2a410 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70  le(pParse, pA, p
2a420 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  B) ){.    return
2a430 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e   0;.  }.  combin
2a440 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c  edFlags = pA->fl
2a450 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b  ags | pB->flags;
2a460 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46  .  if( combinedF
2a470 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
2a480 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ue ){.    if( (p
2a490 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61  A->flags&pB->fla
2a4a0 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21  gs&EP_IntValue)!
2a4b0 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c  =0 && pA->u.iVal
2a4c0 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65  ue==pB->u.iValue
2a4d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a4e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
2a4f0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
2a500 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
2a510 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
2a520 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
2a530 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
2a540 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
2a550 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c  >pLeft,pB,iTab)<
2a560 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
2a570 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2a580 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
2a590 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
2a5a0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2a5b0 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74  se, pA,pB->pLeft
2a5c0 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
2a5d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2a5e0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
2a5f0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
2a600 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
2a610 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
2a620 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54  LUMN && pA->u.zT
2a630 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
2a640 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pA->op==TK_FUNCT
2a650 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ION ){.      if(
2a660 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2a670 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
2a680 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
2a690 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65  return 2;.    }e
2a6a0 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d  lse if( pA->op==
2a6b0 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
2a6c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2a6d0 73 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a 54  stricmp(pA->u.zT
2a6e0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
2a6f0 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
2a700 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a710 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  strcmp(pA->u.zTo
2a720 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
2a730 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
2a740 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
2a750 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
2a760 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2a770 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
2a780 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
2a790 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
2a7a0 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
2a7b0 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
2a7c0 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
2a7d0 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
2a7e0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
2a7f0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2a800 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2a810 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2a820 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
2a830 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65  Left, iTab) ) re
2a840 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
2a850 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a860 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
2a870 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
2a880 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
2a890 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
2a8a0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2a8b0 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
2a8c0 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
2a8d0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
2a8e0 20 20 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d      assert( (com
2a8f0 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
2a900 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
2a910 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54     if( pA->op!=T
2a920 4b 5f 53 54 52 49 4e 47 20 26 26 20 70 41 2d 3e  K_STRING && pA->
2a930 6f 70 21 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45  op!=TK_TRUEFALSE
2a940 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
2a950 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
2a960 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
2a970 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
2a980 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
2a990 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
2a9a0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
2a9b0 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
2a9c0 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
2a9d0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
2a9e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a9f0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
2aa00 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2aa10 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
2aa20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
2aa30 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
2aa40 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
2aa50 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
2aa60 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
2aa70 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
2aa80 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
2aa90 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
2aaa0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
2aab0 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
2aac0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
2aad0 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
2aae0 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
2aaf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ab00 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
2ab10 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
2ab20 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
2ab30 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
2ab40 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
2ab50 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
2ab60 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
2ab70 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
2ab80 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
2ab90 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
2aba0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2abb0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
2abc0 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
2abd0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
2abe0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
2abf0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
2ac00 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
2ac10 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
2ac20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
2ac30 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
2ac40 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
2ac50 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
2ac60 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2ac70 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
2ac80 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
2ac90 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2aca0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
2acb0 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
2acc0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
2acd0 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
2ace0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
2acf0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
2ad00 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
2ad10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
2ad20 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2ad30 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
2ad40 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
2ad50 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
2ad60 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
2ad70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
2ad80 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
2ad90 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
2ada0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2adb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2adc0 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
2add0 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
2ade0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2adf0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2ae00 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
2ae10 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29  te3ExprCompare()
2ae20 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20   except COLLATE 
2ae30 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65  operators at the
2ae40 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72   top-level.** ar
2ae50 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  e ignored..*/.in
2ae60 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
2ae70 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70  pareSkip(Expr *p
2ae80 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
2ae90 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e   iTab){.  return
2aea0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2aeb0 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20  are(0,.         
2aec0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
2aed0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a  kipCollate(pA),.
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2aef0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2af00 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20  ate(pB),.       
2af10 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a        iTab);.}..
2af20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2af30 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
2af40 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
2af50 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
2af60 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
2af70 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
2af80 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
2af90 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
2afa0 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
2afb0 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
2afc0 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
2afd0 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
2afe0 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
2aff0 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
2b000 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2b010 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
2b020 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
2b030 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
2b040 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
2b050 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
2b060 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
2b070 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
2b080 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
2b090 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2b0a0 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
2b0b0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2b0c0 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
2b0d0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
2b0e0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2b0f0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
2b100 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
2b110 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2b120 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2b130 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
2b140 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2b150 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
2b160 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
2b170 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
2b180 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
2b190 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
2b1a0 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
2b1b0 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
2b1c0 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
2b1d0 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
2b1e0 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72  b..**.** If pPar
2b1f0 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  se is not NULL, 
2b200 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
2b210 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  of bound variabl
2b220 65 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a  es in pE1 are .*
2b230 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e  * compared again
2b240 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  st literal value
2b250 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61  s in pE2 and pPa
2b260 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d  rse->pVdbe->expm
2b270 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69  ask is.** modifi
2b280 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69  ed to record whi
2b290 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  ch bound variabl
2b2a0 65 73 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  es are reference
2b2b0 64 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a  d.  If pParse .*
2b2c0 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  * is NULL, then 
2b2d0 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65  false will be re
2b2e0 74 75 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f  turned if pE1 co
2b2f0 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64  ntains any bound
2b300 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
2b310 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  * When in doubt,
2b320 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20   return false.  
2b330 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d  Returning true m
2b340 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
2b350 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f  ormance.** impro
2b360 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  vement.  Returni
2b370 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63  ng false might c
2b380 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  ause a performan
2b390 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75  ce reduction, bu
2b3a0 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77  t.** it will alw
2b3b0 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72  ays give the cor
2b3c0 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20  rect answer and 
2b3d0 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20  is hence always 
2b3e0 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  safe..*/.int sql
2b3f0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2b400 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
2b410 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78  e, Expr *pE1, Ex
2b420 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61  pr *pE2, int iTa
2b430 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b){.  if( sqlite
2b440 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2b450 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69  rse, pE1, pE2, i
2b460 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
2b470 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2b480 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
2b490 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
2b4a0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2b4b0 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2b4c0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20  ->pLeft, iTab). 
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2b4e0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2b4f0 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  sExpr(pParse, pE
2b500 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
2b510 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
2b520 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2b530 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
2b540 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d  _NOTNULL && pE1-
2b550 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
2b560 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
2b570 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58   ){.    Expr *pX
2b580 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
2b590 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70  ipCollate(pE1->p
2b5a0 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63  Left);.    testc
2b5b0 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c  ase( pX!=pE1->pL
2b5c0 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73  eft );.    if( s
2b5d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2b5e0 65 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70 45  e(pParse, pX, pE
2b5f0 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
2b600 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
2b610 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2b620 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2b630 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 63 61  the Expr node ca
2b640 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74  llback for sqlit
2b650 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  e3ExprImpliesNot
2b660 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20 49 66  NullRow()..** If
2b670 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2b680 6e 6f 64 65 20 72 65 71 75 69 72 65 73 20 74 68  node requires th
2b690 61 74 20 74 68 65 20 74 61 62 6c 65 20 61 74 20  at the table at 
2b6a0 70 57 61 6c 6b 65 72 2d 3e 69 43 75 72 0a 2a 2a  pWalker->iCur.**
2b6b0 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   have a non-NULL
2b6c0 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65   column, then se
2b6d0 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  t pWalker->eCode
2b6e0 20 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e   to 1 and abort.
2b6f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2b700 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2b710 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2b720 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2b730 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2b740 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
2b750 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
2b760 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  e expressions an
2b770 64 20 73 6f 20 69 74 0a 20 20 2a 2a 20 63 61 6e  d so it.  ** can
2b780 6e 6f 74 20 68 61 76 65 20 61 6e 79 20 54 4b 5f  not have any TK_
2b790 41 47 47 5f 43 4f 4c 55 4d 4e 20 65 6e 74 72 69  AGG_COLUMN entri
2b7a0 65 73 20 62 65 63 61 75 73 65 20 74 68 6f 73 65  es because those
2b7b0 20 61 72 65 20 6f 6e 6c 79 20 66 6f 75 6e 64 0a   are only found.
2b7c0 20 20 2a 2a 20 69 6e 20 48 41 56 49 4e 47 20 63    ** in HAVING c
2b7d0 6c 61 75 73 65 73 2e 20 20 57 65 20 63 61 6e 20  lauses.  We can 
2b7e0 67 65 74 20 61 20 54 4b 5f 41 47 47 5f 46 55 4e  get a TK_AGG_FUN
2b7f0 43 54 49 4f 4e 20 69 6e 20 61 20 57 48 45 52 45  CTION in a WHERE
2b800 20 63 6c 61 75 73 65 2c 0a 20 20 2a 2a 20 62 75   clause,.  ** bu
2b810 74 20 74 68 61 74 20 69 73 20 61 6e 20 69 6c 6c  t that is an ill
2b820 65 67 61 6c 20 63 6f 6e 73 74 72 75 63 74 20 61  egal construct a
2b830 6e 64 20 74 68 65 20 71 75 65 72 79 20 77 69 6c  nd the query wil
2b840 6c 20 62 65 20 72 65 6a 65 63 74 65 64 20 61 74  l be rejected at
2b850 0a 20 20 2a 2a 20 61 20 6c 61 74 65 72 20 73 74  .  ** a later st
2b860 61 67 65 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  age of processin
2b870 67 2c 20 73 6f 20 74 68 65 20 54 4b 5f 41 47 47  g, so the TK_AGG
2b880 5f 46 55 4e 43 54 49 4f 4e 20 63 61 73 65 20 64  _FUNCTION case d
2b890 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 65  oes not.  ** nee
2b8a0 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72  d to be consider
2b8b0 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 61 73  ed here. */.  as
2b8c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
2b8d0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
2b8e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
2b8f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2b900 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 0a 20 20 69  FUNCTION );..  i
2b910 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2b920 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
2b930 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
2b940 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69  WRC_Prune;.  swi
2b950 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2b960 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  {.    case TK_IS
2b970 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
2b980 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  _NOT:.    case T
2b990 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
2b9a0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
2b9b0 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
2b9c0 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20 20 20  se TK_CASE:.    
2b9d0 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20  case TK_IN:.    
2b9e0 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
2b9f0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
2ba00 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2ba10 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74  ISNOT );.      t
2ba20 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2ba30 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
2ba40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2ba50 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55  xpr->op==TK_ISNU
2ba60 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
2ba70 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2ba80 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
2ba90 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2baa0 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
2bab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2bac0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45  xpr->op==TK_CASE
2bad0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2bae0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2baf0 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IN );.      te
2bb00 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2bb10 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
2bb20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2bb30 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63 61  RC_Prune;.    ca
2bb40 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
2bb50 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
2bb60 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e  >u.iCur==pExpr->
2bb70 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
2bb80 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2bb90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2bba0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2bbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2bbc0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2bbd0 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20  .    /* Virtual 
2bbe0 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77  tables are allow
2bbf0 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74 72  ed to use constr
2bc00 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c  aints like x=NUL
2bc10 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20  L.  So.    ** a 
2bc20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
2bc30 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70 72   x=y does not pr
2bc40 6f 76 65 20 74 68 61 74 20 79 20 69 73 20 6e 6f  ove that y is no
2bc50 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20 20  t null if x.    
2bc60 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ** is the column
2bc70 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
2bc80 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ble */.    case 
2bc90 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20  TK_EQ:.    case 
2bca0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
2bcb0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
2bcc0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
2bcd0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
2bce0 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65 73  TK_GE:.      tes
2bcf0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bd00 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
2bd10 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bd20 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
2bd30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2bd40 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2bd50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2bd60 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2bd70 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
2bd80 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bd90 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
2bda0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bdb0 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op==TK_GE );. 
2bdc0 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
2bdd0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
2bde0 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75  OLUMN && IsVirtu
2bdf0 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  al(pExpr->pLeft-
2be00 3e 70 54 61 62 29 29 0a 20 20 20 20 20 20 20 7c  >pTab)).       |
2be10 7c 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  | (pExpr->pRight
2be20 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2be30 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78  && IsVirtual(pEx
2be40 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 54 61 62  pr->pRight->pTab
2be50 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  )).      ){.    
2be60 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2be70 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
2be80 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
2be90 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2bea0 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nue;.  }.}../*.*
2beb0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
2bec0 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70 72  on-zero) if expr
2bed0 65 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c  ession p can onl
2bee0 79 20 62 65 20 74 72 75 65 20 69 66 20 61 74 20  y be true if at 
2bef0 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c  least.** one col
2bf00 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54 61  umn of table iTa
2bf10 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20  b is non-null.  
2bf20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2bf30 72 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69  return true.** i
2bf40 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77  f expression p w
2bf50 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e 55  ill always be NU
2bf60 4c 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20 65  LL or false if e
2bf70 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  very column of i
2bf80 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a  Tab.** is NULL..
2bf90 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67 61  **.** False nega
2bfa0 74 69 76 65 73 20 61 72 65 20 61 63 63 65 70 74  tives are accept
2bfb0 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
2bfc0 77 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b 20  words, it is ok 
2bfd0 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72  to return.** zer
2bfe0 6f 20 65 76 65 6e 20 69 66 20 65 78 70 72 65 73  o even if expres
2bff0 73 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76 65  sion p will neve
2c000 72 20 62 65 20 74 72 75 65 20 6f 66 20 65 76 65  r be true of eve
2c010 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61  ry column of iTa
2c020 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20 41  b.** is NULL.  A
2c030 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
2c040 69 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73 73  is merely a miss
2c050 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ed optimization 
2c060 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a  opportunity..**.
2c070 2a 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76  ** False positiv
2c080 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  es are not allow
2c090 65 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41 20  ed, however.  A 
2c0a0 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20 6d  false positive m
2c0b0 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
2c0c0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
2c0d0 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  wer..**.** Terms
2c0e0 20 6f 66 20 70 20 74 68 61 74 20 61 72 65 20 6d   of p that are m
2c0f0 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46 72  arked with EP_Fr
2c100 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63  omJoin (and henc
2c110 65 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d  e that come from
2c120 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  .** the ON or US
2c130 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 4c  ING clauses of L
2c140 45 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20 65  EFT JOINS) are e
2c150 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65  xcluded from the
2c160 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a   analysis..**.**
2c170 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2c180 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
2c190 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
2c1a0 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  n be converted i
2c1b0 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  nto.** an ordina
2c1c0 72 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20  ry JOIN.  The p 
2c1d0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2c1e0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49  WHERE clause.  I
2c1f0 66 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63  f the WHERE.** c
2c200 6c 61 75 73 65 20 72 65 71 75 69 72 65 73 20 74  lause requires t
2c210 68 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20  hat some column 
2c220 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
2c230 6c 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a  le of the LEFT J
2c240 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55  OIN.** be non-NU
2c250 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45 46  LL, then the LEF
2c260 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73 61  T JOIN can be sa
2c270 66 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69  fely converted i
2c280 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61  nto an.** ordina
2c290 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20  ry join..*/.int 
2c2a0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2c2b0 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70  esNonNullRow(Exp
2c2c0 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29 7b  r *p, int iTab){
2c2d0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
2c2e0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2c2f0 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52   impliesNotNullR
2c300 6f 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ow;.  w.xSelectC
2c310 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
2c320 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c330 32 20 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65  2 = 0;.  w.eCode
2c340 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72   = 0;.  w.u.iCur
2c350 20 3d 20 69 54 61 62 3b 0a 20 20 73 71 6c 69 74   = iTab;.  sqlit
2c360 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2c370 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
2c380 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ode;.}../*.** An
2c390 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2c3a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2c3b0 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
2c3c0 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
2c3d0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2c3e0 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  if an expression
2c3f0 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65   can be evaluate
2c400 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74  d by reference t
2c410 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  o the.** index o
2c420 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76  nly, without hav
2c430 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72  ing to do a sear
2c440 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ch for the corre
2c450 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c  sponding.** tabl
2c460 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64  e entry.  The Id
2c470 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c  xCover.pIdx fiel
2c480 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20  d is the index. 
2c490 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a   IdxCover.iCur.*
2c4a0 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  * is the cursor 
2c4b0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  for the table..*
2c4c0 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65  /.struct IdxCove
2c4d0 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  r {.  Index *pId
2c4e0 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  x;     /* The in
2c4f0 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
2c500 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
2c510 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
2c520 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2c530 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
2c540 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  le corresponding
2c550 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   to the index */
2c560 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .};../*.** Check
2c570 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
2c580 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20   are references 
2c590 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
2c5a0 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ble .** pWalker-
2c5b0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
2c5c0 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66  ur can be satisf
2c5d0 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ied using the in
2c5e0 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  dex.** pWalker->
2c5f0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
2c600 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
2c610 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61   exprIdxCover(Wa
2c620 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2c630 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
2c640 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
2c650 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
2c660 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
2c670 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2c680 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71  r->iCur.   && sq
2c690 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
2c6a0 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ex(pWalker->u.pI
2c6b0 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70  dxCover->pIdx, p
2c6c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30  Expr->iColumn)<0
2c6d0 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  .  ){.    pWalke
2c6e0 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
2c6f0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2c700 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rt;.  }.  return
2c710 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2c720 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
2c730 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49  e if an index pI
2c740 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68  dx on table with
2c750 20 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e   cursor iCur con
2c760 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68  tains will.** th
2c770 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
2c780 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  pr.  Return true
2c790 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f   if the index do
2c7a0 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20  es cover the.** 
2c7b0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66  expression and f
2c7c0 61 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70  alse if the pExp
2c7d0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66  r expression ref
2c7e0 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f  erences table co
2c7f0 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72  lumns.** that ar
2c800 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74  e not found in t
2c810 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  he index pIdx..*
2c820 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f  *.** An index co
2c830 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73  vering an expres
2c840 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  sion means that 
2c850 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
2c860 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74  an be.** evaluat
2c870 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68  ed using only th
2c880 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68  e index and with
2c890 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f  out having to lo
2c8a0 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72  okup the.** corr
2c8b0 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
2c8c0 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  entry..*/.int sq
2c8d0 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64  lite3ExprCovered
2c8e0 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20  ByIndex(.  Expr 
2c8f0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
2c900 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
2c910 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  e tested */.  in
2c920 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
2c930 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2c940 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63  number for the c
2c950 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
2c960 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  le */.  Index *p
2c970 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Idx         /* T
2c980 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69  he index that mi
2c990 67 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20  ght be used for 
2c9a0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20  coverage */.){. 
2c9b0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
2c9c0 75 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f  uct IdxCover xco
2c9d0 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  v;.  memset(&w, 
2c9e0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
2c9f0 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75   xcov.iCur = iCu
2ca00 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d  r;.  xcov.pIdx =
2ca10 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72   pIdx;.  w.xExpr
2ca20 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49  Callback = exprI
2ca30 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70  dxCover;.  w.u.p
2ca40 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76  IdxCover = &xcov
2ca50 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2ca60 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
2ca70 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64    return !w.eCod
2ca80 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e;.}.../*.** An 
2ca90 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2caa0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2cab0 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
2cac0 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
2cad0 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
2cae0 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
2caf0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
2cb00 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
2cb10 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
2cb20 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
2cb30 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
2cb40 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
2cb50 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
2cb60 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
2cb70 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
2cb80 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
2cb90 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
2cba0 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
2cbb0 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
2cbc0 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
2cbd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cbe0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2cbf0 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
2cc00 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
2cc10 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
2cc20 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2cc30 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
2cc40 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
2cc50 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
2cc60 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
2cc70 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2cc80 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
2cc90 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
2cca0 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
2ccb0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2ccc0 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
2ccd0 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
2cce0 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
2ccf0 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
2cd00 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
2cd10 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
2cd20 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
2cd30 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2cd40 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
2cd50 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
2cd60 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
2cd70 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
2cd80 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
2cd90 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
2cda0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2cdb0 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
2cdc0 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
2cdd0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
2cde0 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
2cdf0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
2ce00 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
2ce10 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2ce20 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
2ce30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2ce40 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
2ce50 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
2ce60 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
2ce70 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
2ce80 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
2ce90 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
2cea0 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63  rc;.    int nSrc
2ceb0 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e   = pSrc ? pSrc->
2cec0 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f  nSrc : 0;.    fo
2ced0 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69  r(i=0; i<nSrc; i
2cee0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2cef0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
2cf00 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
2cf10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2cf20 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29      if( i<nSrc )
2cf30 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73  {.      p->nThis
2cf40 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
2cf50 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b       p->nOther++
2cf60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2cf70 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2cf80 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
2cf90 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20  rmine if any of 
2cfa0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  the arguments to
2cfb0 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74   the pExpr Funct
2cfc0 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  ion reference.**
2cfd0 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75   pSrcList.  Retu
2cfe0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20  rn true if they 
2cff0 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e  do.  Also return
2d000 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e   true if the fun
2d010 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20  ction.** has no 
2d020 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73  arguments or has
2d030 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61   only constant a
2d040 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
2d050 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72  n false if pExpr
2d060 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63  .** references c
2d070 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63  olumns but not c
2d080 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73  olumns of tables
2d090 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69   found in pSrcLi
2d0a0 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
2d0b0 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
2d0c0 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70  isSrc(Expr *pExp
2d0d0 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  r, SrcList *pSrc
2d0e0 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  List){.  Walker 
2d0f0 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43  w;.  struct SrcC
2d100 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65  ount cnt;.  asse
2d110 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
2d120 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2d130 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2d140 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75  ack = exprSrcCou
2d150 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
2d160 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
2d170 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26  .u.pSrcCount = &
2d180 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20  cnt;.  cnt.pSrc 
2d190 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e  = pSrcList;.  cn
2d1a0 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63  t.nThis = 0;.  c
2d1b0 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20  nt.nOther = 0;. 
2d1c0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2d1d0 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e  List(&w, pExpr->
2d1e0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  x.pList);.  retu
2d1f0 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c  rn cnt.nThis>0 |
2d200 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b  | cnt.nOther==0;
2d210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2d220 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
2d230 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  he pAggInfo->aCo
2d240 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  l[] array.  Retu
2d250 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
2d260 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
2d270 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
2d280 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
2d290 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
2d2a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
2d2b0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71  AggInfoColumn(sq
2d2c0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
2d2d0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
2d2e0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
2d2f0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
2d300 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
2d310 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e    db,.       pIn
2d320 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20  fo->aCol,.      
2d330 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
2d340 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  Col[0]),.       
2d350 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
2d360 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
2d370 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
2d380 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
2d390 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
2d3a0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
2d3b0 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
2d3c0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
2d3d0 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
2d3e0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
2d3f0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
2d400 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
2d410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
2d420 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
2d430 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
2d440 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
2d450 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
2d460 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
2d470 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
2d480 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
2d490 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
2d4a0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
2d4b0 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
2d4c0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
2d4d0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
2d4e0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
2d4f0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
2d500 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
2d510 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
2d520 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
2d530 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
2d540 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
2d550 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2d560 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
2d570 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2d580 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
2d590 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2d5a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2d5b0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2d5c0 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
2d5d0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2d5e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
2d5f0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
2d600 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
2d610 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
2d620 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
2d630 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
2d640 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
2d650 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
2d660 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75 4e  ggInfo = pNC->uN
2d670 43 2e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 61  C.pAggInfo;..  a
2d680 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 63 46 6c  ssert( pNC->ncFl
2d690 61 67 73 20 26 20 4e 43 5f 55 41 67 67 49 6e 66  ags & NC_UAggInf
2d6a0 6f 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  o );.  switch( p
2d6b0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
2d6c0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
2d6d0 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
2d6e0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
2d6f0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2d700 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2d710 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
2d720 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2d730 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
2d740 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
2d750 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
2d760 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
2d770 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
2d780 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
2d790 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
2d7a0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
2d7b0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
2d7c0 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b  (pSrcList!=0) ){
2d7d0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
2d7e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2d7f0 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
2d800 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
2d810 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
2d820 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
2d830 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
2d840 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2d850 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
2d860 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2d870 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2d880 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2d890 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2d8a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
2d8b0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
2d8c0 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
2d8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2d8e0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
2d8f0 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
2d900 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
2d910 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
2d920 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
2d930 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2d940 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
2d950 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
2d960 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
2d970 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
2d980 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
2d990 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
2d9a0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
2d9b0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
2d9c0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
2d9d0 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
2d9e0 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
2d9f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2da00 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
2da10 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
2da20 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
2da30 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
2da40 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
2da50 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
2da60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2da70 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
2da80 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
2da90 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
2daa0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2dab0 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
2dac0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
2dad0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2dae0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2daf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2db00 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
2db10 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2db20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
2db30 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
2db40 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
2db50 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
2db60 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
2db70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2db80 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
2db90 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
2dba0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
2dbb0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
2dbc0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
2dbd0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
2dbe0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2dc00 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
2dc10 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
2dc20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2dc30 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
2dc40 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
2dc50 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2dc60 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
2dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2dc80 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
2dc90 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2dca0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
2dcb0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2dcc0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
2dcd0 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
2dce0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
2dcf0 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
2dd00 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2dd10 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2dd20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2dd30 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
2dd50 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
2dd70 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
2dd80 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2dda0 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
2ddb0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2ddc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
2ddd0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2dde0 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
2ddf0 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
2de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de10 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
2de20 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
2de30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2de40 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2de50 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
2de60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2de70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dea0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2deb0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2dec0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2ded0 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
2dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2def0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2df00 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
2df10 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
2df20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2df30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2df40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
2df50 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
2df60 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
2df70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2df80 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
2df90 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
2dfa0 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
2dfb0 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
2dfc0 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
2dfd0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
2dfe0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
2dff0 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
2e000 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
2e010 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
2e020 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
2e030 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
2e040 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
2e050 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
2e060 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2e070 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
2e080 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
2e090 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
2e0a0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
2e0b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2e0c0 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
2e0d0 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
2e0e0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
2e0f0 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
2e100 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2e110 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
2e120 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
2e130 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
2e140 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
2e150 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
2e160 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
2e170 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2e180 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
2e190 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
2e1a0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
2e1b0 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
2e1c0 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
2e1d0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
2e1e0 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2e1f0 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
2e200 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e210 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
2e220 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
2e230 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
2e240 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
2e250 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
2e260 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
2e270 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
2e280 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
2e290 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
2e2a0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2e2b0 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
2e2c0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
2e2d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2e2e0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2e2f0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2e300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2e310 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2e320 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  (0, pItem->pExpr
2e330 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
2e340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
2e350 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e360 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e370 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
2e380 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
2e390 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
2e3a0 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
2e3b0 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
2e3c0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
2e3d0 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
2e3e0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
2e3f0 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
2e400 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
2e410 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
2e420 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
2e430 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2e440 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
2e450 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2e460 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2e470 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
2e480 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2e490 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
2e4a0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
2e4b0 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
2e4c0 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
2e4d0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
2e4e0 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
2e4f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2e500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
2e510 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2e520 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2e530 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
2e540 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2e550 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
2e560 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
2e570 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
2e580 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2e590 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20  r->u.zToken, .  
2e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5b0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
2e5c0 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
2e5d0 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
2e5e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2e5f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
2e600 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2e610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e620 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2e630 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2e640 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
2e650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e660 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2e670 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2e680 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e6a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
2e6b0 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
2e6c0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2e6d0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2e6e0 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
2e6f0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2e700 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2e710 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2e720 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2e730 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
2e740 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2e750 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2e760 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
2e770 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2e780 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
2e790 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2e7a0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2e7b0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2e7c0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2e7d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2e7e0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
2e7f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2e800 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2e810 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
2e820 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2e830 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
2e840 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2e850 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2e860 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2e870 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  ER(pSelect);.  p
2e880 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2e890 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  pth++;.  return 
2e8a0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2e8b0 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c  static void anal
2e8c0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2e8d0 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72 20  electEnd(Walker 
2e8e0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2e8f0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2e900 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2e910 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b  Select);.  pWalk
2e920 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d  er->walkerDepth-
2e930 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  -;.}../*.** Anal
2e940 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
2e950 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
2e960 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
2e970 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
2e980 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
2e990 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
2e9a0 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
2e9b0 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
2e9c0 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
2e9d0 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
2e9e0 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
2e9f0 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
2ea00 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
2ea10 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
2ea20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
2ea30 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2ea40 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
2ea50 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
2ea60 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
2ea70 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
2ea80 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
2ea90 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2eaa0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2eab0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2eac0 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
2ead0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
2eae0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2eaf0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2eb00 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  e;.  w.xSelectCa
2eb10 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2eb20 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2eb30 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ct;.  w.xSelectC
2eb40 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79  allback2 = analy
2eb50 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2eb60 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c  lectEnd;.  w.wal
2eb70 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20  kerDepth = 0;.  
2eb80 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
2eb90 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
2eba0 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
2ebb0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2ebc0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
2ebd0 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
2ebe0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2ebf0 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
2ec00 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
2ec10 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
2ec20 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
2ec30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2ec40 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
2ec50 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
2ec60 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
2ec70 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
2ec80 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2ec90 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
2eca0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2ecb0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2ecc0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
2ecd0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2ece0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2ecf0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2ed00 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
2ed10 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
2ed20 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
2ed30 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2ed40 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2ed50 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
2ed60 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2ed70 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
2ed80 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
2ed90 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
2eda0 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
2edb0 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
2edc0 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
2edd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2ede0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2edf0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2ee00 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
2ee10 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
2ee20 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
2ee30 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
2ee40 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
2ee50 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
2ee60 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2ee70 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
2ee80 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
2ee90 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
2eea0 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
2eeb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
2eec0 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
2eed0 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
2eee0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2eef0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
2ef00 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64  eallocation is d
2ef10 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
2ef20 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c  e column cache l
2ef30 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a  ine that uses.**
2ef40 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65   the register be
2ef50 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a  comes stale..*/.
2ef60 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
2ef70 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
2ef80 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2ef90 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
2efa0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
2efb0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
2efc0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
2efd0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2efe0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
2eff0 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  he *p;.    for(i
2f000 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
2f010 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
2f020 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
2f030 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69  +, p++){.      i
2f040 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
2f050 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74   ){.        p->t
2f060 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  empReg = 1;.    
2f070 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2f080 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
2f090 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
2f0a0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
2f0b0 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
2f0c0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2f0d0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
2f0e0 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
2f0f0 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
2f100 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ters..*/.int sql
2f110 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2f120 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2f130 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
2f140 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65   i, n;.  if( nRe
2f150 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71  g==1 ) return sq
2f160 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2f170 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70  pParse);.  i = p
2f180 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2f190 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
2f1a0 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
2f1b0 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20   nReg<=n ){.    
2f1c0 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43  assert( !usedAsC
2f1d0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
2f1e0 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a  e, i, i+n-1) );.
2f1f0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
2f200 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
2f210 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2f220 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
2f230 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
2f240 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
2f250 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2f260 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
2f270 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
2f280 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2f290 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
2f2a0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
2f2b0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66   int nReg){.  if
2f2c0 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
2f2d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2f2e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
2f2f0 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Reg);.    return
2f300 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2f310 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
2f320 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
2f330 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
2f340 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2f350 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2f360 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
2f370 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
2f380 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
2f390 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
2f3a0 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
2f3b0 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
2f3c0 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
2f3d0 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
2f3e0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
2f3f0 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
2f400 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
2f410 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
2f420 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
2f430 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
2f440 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68  *.** Validate th
2f450 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20  at no temporary 
2f460 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77  register falls w
2f470 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2f480 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c  of.** iFirst..iL
2f490 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
2f4a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2f4b0 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20   only call from 
2f4c0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a  within assert().
2f4d0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ** statements..*
2f4e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2f4f0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
2f500 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
2f510 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2f520 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69  nt iFirst, int i
2f530 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Last){.  int i;.
2f540 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52    if( pParse->nR
2f550 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20  angeReg>0.   && 
2f560 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2f570 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g+pParse->nRange
2f580 52 65 67 20 3e 20 69 46 69 72 73 74 0a 20 20 20  Reg > iFirst.   
2f590 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2f5a0 65 52 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20  eReg <= iLast.  
2f5b0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
2f5c0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
2f5d0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70   i<pParse->nTemp
2f5e0 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Reg; i++){.    i
2f5f0 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  f( pParse->aTemp
2f600 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26  Reg[i]>=iFirst &
2f610 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  & pParse->aTempR
2f620 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a  eg[i]<=iLast ){.
2f630 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2f640 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2f650 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
2f660 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
2f670 2f 0a                                            /.